Regex “Perl外部匹配”;如果;不';t在循环中重置$1
我正在修补Zoidberg Perl shell,以修复现代Perl版本在测试时抛出的一些错误。请注意,我不是原作者,也不是在批评他。我遇到了一个有趣的问题,我想了解一下历史 下面的代码获取一个输入数组,对于每个输入,去掉并结束符号。然后它将该符号存储在一个变量中,如果它没有找到它,则将其存储为0。原始文件中的代码看起来像测试A,必须一直工作到PerlV5.8给出的结果。无论如何,问题在于,如果s///不在“if”测试的内部,则在循环时,$1变量将与最后一个值保持一致。这是我的测试。我想知道人们是否能解释为什么会发生这种情况,或者为什么它曾经起作用,我想我理解正在发生的事情Regex “Perl外部匹配”;如果;不';t在循环中重置$1,regex,perl,Regex,Perl,我正在修补Zoidberg Perl shell,以修复现代Perl版本在测试时抛出的一些错误。请注意,我不是原作者,也不是在批评他。我遇到了一个有趣的问题,我想了解一下历史 下面的代码获取一个输入数组,对于每个输入,去掉并结束符号。然后它将该符号存储在一个变量中,如果它没有找到它,则将其存储为0。原始文件中的代码看起来像测试A,必须一直工作到PerlV5.8给出的结果。无论如何,问题在于,如果s///不在“if”测试的内部,则在循环时,$1变量将与最后一个值保持一致。这是我的测试。我想知道人们
#!/usr/bin/perl
use strict;
use warnings;
my @a = qw/n a$ b@ c/;
my @b = @a;
my @c = @a;
print "Test A -- Doesn't work (c !-> 0)\n";
for (@a) {
s/([\$\@\%])$//;
my $arg = $1 || 0;
print $_ . " -> " . $arg . "\n";
}
print "\nTest B -- Works\n";
for (@b) {
my $arg;
if (s/([\$\@\%])$//) {;
$arg = $1;
}
$arg ||= 0;
print $_ . " -> " . $arg . "\n";
}
print "\nTest C -- Works, more clever\n";
for (@c) {
my $arg = s/([\$\@\%])$// ? $1 : 0;
print $_ . " -> " . $arg . "\n";
}
发件人:
注意:Perl中失败的匹配不会重置匹配变量,因为
使编写这样的代码变得更容易
测试一系列更具体的
案例和记忆的最佳匹配
但是你是对的,测试A和5.8.9中的其他两个一样有效。我在中找不到任何解释,但在5.10中有许多重新更改,其中一个肯定影响了这一点。我不认为5.8行为是有意的。这就是为什么在大多数情况下应该使用
if(regex){#使用$1,等等。
。谢谢你,这一定不是一直都是这样,这种行为改变了吗,也许是在v5.10版本?我对Perl场景还很陌生,大约1年了。`我不认为5.8的行为是有意的。`是的,我想这就是我想知道的。谢谢!这个小宝石是alh发现的,'错误报告是一个失败的匹配(实际上是一个失败的s///g)正在重置匹配变量,因此它没有按文档记录的方式工作。““错误报告是一个失败的匹配(实际上是一个失败的s///g)正在重置匹配变量,因此它没有按文档记录的方式工作。”大约在5.6.0版本中引入了5C5E4C245ABEFEFF949EE72DD179EFF31D923DCB2,并在5.10.0版本中使用c74340f9cdee6010339b6bfd0e8b0dc8bc875344进行了固定。