Frage Merkwürdiges in Perls Eval-Funktion


Ich bekomme folgende Warnung:

"Verwendung von nicht initialisierten Wert in Verkettung (.) Oder Zeichenfolge in C: \ tools \ test.pl Zeile 17, Datenzeile 1."

Aber die nächste Zeile von __DATA__ wird ohne Vorwarnung verarbeitet und bekommt diese:

test1b.txt: test1c.txt: test: test

Merkwürdiger ist es, wenn ich eine Zeile hinzufüge: print "$line:".$'."\n"; Die Warnung ist verschwunden.

Hat jemand Hinweise?

#!/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

5
2018-06-07 06:08


Ursprung


Antworten:


Perl berücksichtigt $&, $', und $` teuer zu sein, so wird es sie tatsächlich in einem Programm nicht bevölkern, das sie nicht verwendet. Von dem perlvar Manpage:

Die Verwendung dieser Variablen [$&] irgendwo in einem Programm auferlegt eine erhebliche   Leistungseinbußen bei allen Übereinstimmungen mit regulären Ausdrücken. Um es zu umgehen   Strafe, können Sie die gleiche Teilzeichenfolge mit verwenden @-. Beginnend   Mit Perl 5.10 können Sie die /p Matchflagge und die ${^MATCH}   Variable, um das gleiche für bestimmte Match-Operationen zu tun.

Wenn Sie sie jedoch nur in einer Zeichenfolge verwenden, an die Sie übergeben werden evalPerl kann nicht sagen dass Sie sie verwenden, also werden sie nicht aufgefüllt, daher sind sie undefiniert.


10
2018-06-07 06:15