2017-03-24 43 views
1

我一直在努力与我的代码段有一段时间了,不知道它。似乎与如何处理$ 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 

似乎之一$指定[0]以某种方式与该两个$干扰[0]。这对我来说似乎很奇怪,因为这两个变量和它们的名称不应以任何方式交互

回答

6

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

  • //g在标量上下文设置pos($_)[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)来标记。