当我试图在搜索到的字符之后查找字符时,Perl将返回hash



我想在字符串中搜索给定的字符,并返回后面的字符。

根据这里的一篇帖子,我试着写

my $string = 'v' . '2';
my $char = $string =~ 'v'.{0,1};
print $char;

但它返回1和一个散列(上次运行它时,确切的输出是1HASH(0x11823a498((。有人知道它为什么返回散列而不是字符吗?

在特定模式(此处为字符(后返回一个字符

my $string = 'example';
my $pattern = qr(e);
my ($ret) = $string =~ /$pattern(.)/;  #--> 'x'

这将匹配$string中第一个出现的$pattern,并捕获并返回下一个字符x。(这个例子不处理可能没有字符跟随的情况,就像其他e一样;它只是不匹配,所以$ret将保持undef。(

我使用qr运算符来形成模式,但普通字符串在这里也可以。

regex match运算符在标量上下文和列表上下文中返回不同的内容:在标量上下文中,它是否匹配是true/false,而在列表上下文中它返回匹配。参见perlretut

因此,您需要在列表上下文中进行匹配,而提供匹配的一种常见方法是将分配给的变量放在括号中。


问题中的例子的第一个问题是=~算子比.算子结合得更紧密,因此该例子是有效的

my $char = ( ($string =~ 'v') . {0,1} );

因此,首先是正则表达式匹配,它成功并返回1(因为它在标量上下文中,由.运算符强加(,然后是连接到该1的哈希引用{0,1}。因此,$char被分配了与hashref的字符串连接的1,该字符串是字符串HASH(0x...)(在parens中是地址的十六进制字符串(。

接下来,模式中所需的.不存在。与级联.运算符混淆了吗?

然后,捕获括号就不存在了,而预期的子模式需要它。

最后,匹配是标量上下文,如前所述,它只会产生true/false。

总之,这需要

my ($char) = $string =~ ( q{v} . q{(.)} );

但我想补充一点:虽然Perl具有非常灵活的语义,但我建议不要像那样动态构建regex模式。为了清晰起见,我还建议在match运算符中实际使用分隔符(尽管您基本上不必这样做(。

最新更新