2013-06-07 15 views
5

uzyskać następujące ostrzeżenie:Najdziwniejsze w funkcji eval Perl

"(.) Wykorzystanie wartości niezainicjowanych w konkatenacji lub ciąg w C: \ Tools \ test.pl linia 17, linia danych 1."

Ale następna linia __DATA__ będą przetwarzane bez żadnego ostrzeżenia i dostać te:

test1b.txt: test test1c.txt: test: test

bardziej dziwne jest to, że po dodaniu linii: print "$line:".$'."\n"; Ostrzeżenie znikło.

Ktoś ma jakieś wskazówki?

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

Odpowiedz

10

Perl uważa $&, $' i $` być drogie, więc nie będzie właściwie wypełniać je w programie, który nie je wykorzystać. Z perlvar manpage:

Zastosowanie tej zmiennej [$&] w dowolnym miejscu w programie nakłada znaczne spadku wydajności na wszystkich wyrażenie regularne pasuje. Aby uniknąć kary , możesz wyodrębnić ten sam podłańcuch za pomocą @-. Począwszy od z Perlem 5.10, możesz użyć flagi dopasowania /p i zmiennej ${^MATCH} , aby zrobić to samo dla konkretnych operacji dopasowywania.

Jednak, kiedy tylko ich używać wewnątrz łańcucha, które przechodzą do eval, Perl nie może powiedzieć że jesteś ich użyciu, więc nie będzie je zapełnić, więc oni będą niezdefiniowane .

+0

Dobra uwaga! Rzadko używam "eval". Niektóre linki podają więcej informacji na temat jego użycia, takich jak http://stackoverflow.com/questions/10909127/perl-why-doesnt-eval-set-1. – user2462304