5

次の警告が表示されます。

「C:\tools\test.pl 行 17、DATA 行 1 の連結 (.) または文字列で初期化されていない値が使用されています。」

しかし、次の行は__DATA__警告なしで処理され、次のようになります。

test1b.txt:テスト test1c.txt:テスト :テスト

さらに奇妙なことは、行を追加すると、print "$line:".$'."\n";警告が消えたことです。

誰か手がかりを持っていますか?

#!/usr/bin/perl -w
use strict;
my $pattern='test';
my $output='$&';
while(<DATA>)
{
    chomp;
    my $line=$_;
    chomp($line);
    $line=~/$pattern/;
    #print "$line:".$&."\n";   #why uncommenting this line make the following line pass without no warning.
    my $result="$line:".eval($output)."\n";
    print $result;
}

__DATA__
test1a.txt
test1b.txt
test1c.txt
4

1 に答える 1

10

Perl は$&$'、および$`を高価であると見なしているため、それらを使用しないプログラムでは実際にそれらを設定しません。マンページからperlvar

プログラム内の任意の場所でこの変数 [ $&] を使用すると、すべての正規表現の一致でパフォーマンスが大幅に低下します。このペナルティを回避するには、 を使用して同じ部分文字列を抽出できます@-。Perl 5.10 から、/p一致フラグと${^MATCH} 変数を使用して、特定の一致操作に対して同じことを行うことができます。

ただし、 に渡す文字列内でのみ使用するとeval、Perl はそれらを使用していることを認識できないため、それらを設定せず、未定義になります。

于 2013-06-07T06:15:57.167 に答える