我想在字符串中搜索给定的字符,并返回后面的字符。
根据这里的一篇帖子,我试着写
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运算符中实际使用分隔符(尽管您基本上不必这样做(。