我想在字符串中搜索给定的字符并返回它后面的字符。
根据此处的帖子,我尝试写作
my $string = 'v' . '2';
my $char = $string =~ 'v'.{0,1};
print $char;
Run Code Online (Sandbox Code Playgroud)
但这会返回 1 和一个哈希值(我上次运行它时,确切的输出是 1HASH(0x11823a498))。有谁知道为什么它返回一个散列而不是字符?
返回特定模式后的字符(此处为字符)
my $string = 'example';
my $pattern = qr(e);
my ($ret) = $string =~ /$pattern(.)/; #--> 'x'
Run Code Online (Sandbox Code Playgroud)
这匹配 中第一次出现$pattern的$string,并捕获并返回下一个字符x。(该示例不处理可能没有字符跟随的情况,就像 other 一样e;它只是无法匹配,因此$ret会保持undef。)
我使用qr运算符来形成一个模式,但普通字符串在这里也可以。
正则表达式匹配运算符在标量和列表上下文中返回不同的东西:在标量上下文中它是否匹配是真/假,而在列表上下文中它返回匹配。见perlretut
因此,您需要将该匹配项放在列表上下文中,并且提供该匹配项的常用方法是将分配给的变量放在括号中。
问题中例子的第一个问题是=~运算符绑定比.运算符更紧密,所以例子是有效的
my $char = ( ($string =~ 'v') . {0,1} );
Run Code Online (Sandbox Code Playgroud)
所以首先是正则表达式匹配,它成功并返回1(因为它在标量上下文中,由.运算符强加),然后有一个散列引用{0,1},它连接到那个1. 所以$char被分配了1与 hashref 的字符串化连接的字符串,它是一个字符串HASH(0x...)(在括号中是地址的十六进制字符串化)。
接下来,.模式中所需的不存在。对连接.运算符感到困惑吗?
然后,捕获括号不存在,但需要用于预期的子模式。
最后,匹配是标量上下文,如上所述,只会产生真/假。
总而言之,这将需要
my ($char) = $string =~ ( q{v} . q{(.)} );
Run Code Online (Sandbox Code Playgroud)
但我想补充一点:虽然 Perl 具有非常流畅的语义,但我建议不要像那样即时构建正则表达式模式。为清楚起见,我还建议在匹配运算符中实际使用分隔符(即使您确实大多数情况下不必这样做)。