2017-03-24 3 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]。 2つの変数とその指定が相互作用してはならないので、これは私にとっては奇妙に思えます

答えて

6

if (//)の代わりにif (//g)を使用したからです。スカラコンテキストで

  • //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)をトークン化する場合を除き、
関連する問題