当我试图在搜索字符后查找字符时,Perl 返回散列

Perl is returning hash when I am trying to find the characters after a searched-for character

我想搜索字符串中的给定字符和 return 它后面的字符。

根据这里的post,我试着写

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

但是这个returns 1和一个散列(上次我运行它,确切的输出是1HASH(0x11823a498))。有谁知道为什么它 return 是哈希而不是字符?

Return特定模式后的字符(此处为字符)

my $string = 'example';
my $pattern = qr(e);

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

这匹配 $string 中第一次出现的 $pattern,并捕获 returns 下一个字符 x。 (该示例不处理后面可能没有字符的情况,例如另一个 e;它根本无法匹配,因此 $ret 将保持 undef。)

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

正则表达式匹配运算符 returns 标量和列表中的不同之处 contexts: in the scalar context it is true/false for whether it matched, while in the list context it returns matches. See perlretut

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


问题中示例的第一个问题是 =~ 运算符 binds. 运算符更紧密,因此该示例实际上是

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

所以首先是正则表达式匹配,它成功了,然后是 returns 1(因为它在标量上下文中,由 . 运算符强加)然后是哈希-reference {0,1} 连接到 1。因此 $char 被分配了 1 与 hashref 的字符串化连接,这是一个字符串 HASH(0x...) (在括号中是地址的十六进制字符串化)。

接下来,模式中所需的 . 不存在。对连接 . 运算符感到困惑?

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

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

总而言之,需要

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

但我想补充一点:虽然 Perl 具有非常流畅的语义,但我建议不要像那样即时构建正则表达式模式。为了清楚起见,我还建议在匹配运算符中实际使用定界符(即使您确实大部分时间都不必这样做)。