Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex “Perl外部匹配”;如果;不';t在循环中重置$1_Regex_Perl - Fatal编程技术网

Regex “Perl外部匹配”;如果;不';t在循环中重置$1

Regex “Perl外部匹配”;如果;不';t在循环中重置$1,regex,perl,Regex,Perl,我正在修补Zoidberg Perl shell,以修复现代Perl版本在测试时抛出的一些错误。请注意,我不是原作者,也不是在批评他。我遇到了一个有趣的问题,我想了解一下历史 下面的代码获取一个输入数组,对于每个输入,去掉并结束符号。然后它将该符号存储在一个变量中,如果它没有找到它,则将其存储为0。原始文件中的代码看起来像测试A,必须一直工作到PerlV5.8给出的结果。无论如何,问题在于,如果s///不在“if”测试的内部,则在循环时,$1变量将与最后一个值保持一致。这是我的测试。我想知道人们

我正在修补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进行了固定。