我正在修补Zoidberg Perl
shell以修复现代Perl版本在测试时抛出的一些错误.请注意,我不是原作者,也不是我批评他.我遇到了一个有趣的问题,我想要一点历史.
下面的代码采用一系列输入,每个条带关闭和结束sigil.然后它将该sigil存储在一个变量中,如果它没有找到它存储0.原始文件中的代码看起来像测试A,并且必须一直有效,直到并包含perl v5.8给出cpantesters结果.无论如何问题是,如果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"; }
解决方法
从
perlre开始:
NOTE: Failed matches in Perl do not reset the match variables,which
makes it easier to write code that
tests for a series of more specific
cases and remembers the best match.
但是你是对的,测试A确实像5.8.9中的其他两个一样工作.我在5.10.0 release notes中找不到解释它的任何内容,但5.10中有许多RE更改,其中一个必须影响到这一点.我不认为5.8的行为是有意的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。