perl 在绑定操作之后,字符串中是否有任何内容发生了更改?

dgtucam1  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(147)
my $s = 'x';
print("\$s is $s,\$s =~ s///r is ",$s =~ s///r, ".\n");
$s =~ /x/;
print("\$s is $s,\$s =~ s///r is ",$s =~ s///r, ".\n");

印刷品

$s is x,$s =~ s///r is x.
$s is x,$s =~ s///r is .

那么第三行之后有什么变化呢?

qqrboqgw

qqrboqgw1#

这是关于空字符串模式的行为。

perl -wE'$s = "x arest"; $s =~ /x a/; $r = ($s =~ s///r); say $s; say $r'

打印相同的$s,然后打印rest
当模式是空字符串时,这是一个特殊的行为,它会影响这一点,每个perlop
如果模式评估为空字串,则会改用上次成功执行的正则表达式。
显然,//(空字符串)模式被最后一个匹配项替换,而 * 即 * 在这里被从字符串中删除;然后在/r下剩下的返回

perl -wE'$s = "x arest"; $s =~ /x a/; $r = ($s =~ s//X/r); say $r'

打印Xrest
几点注意事项

  • 这不受pos的影响,因为此代码的工作方式相同
perl -wE'$s = "x arest"; $s =~ /x a/g; pos $s = 1; $r = ($s =~ s///r); say $r'

我添加了/g,以便能够使用pos。只使用$&

  • 关于零长度子串的重复匹配的部分在这方面显然很有趣,也许是为了解释这种行为的基本原理

相关问题