正则表达式$ 1变量干扰另一个变量

时间:2017-03-24 15:32:13

标签: regex perl

我一段时间以来一直在努力处理我的代码部分,但无法理解。似乎与如何处理$ 1有关,但我找不到任何相关的东西。

正则表达式找到16640021并将其分配到数组中的某个位置。

my @one;
my @two;
my $articleregex = qr/\s*\d*\/\s*\d*\|\s*(.*?)\|/p; # $1 = article number
my $row = "   7/  1|        16640021|Taats 3 IP10                       |14-03-03|        |    |        1,0000|st |   | 01|    | N|  0|";

    if ($row =~ /$articleregex/g) {
        $one[0] = $1; 
    }
    if ($row =~ /$articleregex/g) { 
        $two[0] = $1;
    }
print $one[0];
print $two[0];

哪个输出

Use of uninitialized value in print at perltest3.pl line 13.
16640021

似乎$ one [0]的指定会以某种方式干扰$ 2 [0]的指定。这对我来说似乎很奇怪,因为这两个变量及其名称不应该以任何方式进行交互

1 个答案:

答案 0 :(得分:6)

这是因为您使用了if (//g)而不是if (//)

    标量上下文中的
  • //gpos($_) [1] 设置为匹配停止的位置,或取消设置pos($_) [1] 如果比赛不成功 [2]
  • 标量上下文中的
  • //g在位置pos($_) [1] 处开始匹配。

例如,

$_ = "ab";
say /(.)/g ? $1 : "no match";  # a
say /(.)/g ? $1 : "no match";  # b
say /(.)/g ? $1 : "no match";  # no match
say /(.)/g ? $1 : "no match";  # a

这允许以下内容迭代匹配:

while (/(.)/g) {
   say $1;
}

不要使用if (//g) [3]

  1. $_用于表示与之匹配的变量。
  2. 除非也使用/c
  3. 除非您正在展开while (//g),或者除非您使用if (//gc)进行令牌化。