加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – Perl匹配外“if”不会在循环上重置$1

发布时间:2020-12-14 05:59:02 所属栏目:百科 来源:网络整理
导读:我正在修补Zoidberg Perl shell以修复现代Perl版本在测试时抛出的一些错误.请注意,我不是原作者,也不是我批评他.我遇到了一个有趣的问题,我想要一点历史. 下面的代码采用一系列输入,每个条带关闭和结束sigil.然后它将该sigil存储在一个变量中,如果它没有找到
我正在修补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 -- Worksn";
for (@b) {
  my $arg;
  if (s/([$@%])$//) {;
    $arg = $1;
  }
  $arg ||= 0;
  print $_ . " -> " . $arg . "n";
}

print "nTest C -- Works,more clevern";
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的行为是有意的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读