2017-03-24 44 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)來標記。