Die eingebaute Eval-Funktion von Perl ist sehr leistungsfähig. Lassen Sie uns in diesem Artikel besprechen, wie man Regex in eval verwendet, Fehler mit eval abfängt, dynamischen Code mit eval erstellt, einen Code aus einer Datei/Unterroutine mit eval einfügt usw.,
Die allgemeine Form von perl eval erwartet einen Ausdruck oder einen Codeblock als Argument.
1. Unterschiede zwischen verschiedenen Perl-Eval-Anweisungen
Betrachten wir das folgende Perl-Code-Snippet:
$expr =‘$a + $b’;
eval $expr; # 1
eval „$expr“; # 2
eval ‘$expr’; # 3
eval { $expr }; # 4
Fall Nr. 1 und Nr. 2 sind identisch, wobei Perl sie als gültige ausführbare Anweisung identifiziert und den Ausdruck auswertet. Das Ergebnis wäre also „30“.
Im Fall #3 kann der Ausdruck nicht erweitert werden. Als Ergebnis erhält man also den tatsächlichen Ausdruck ($a + $b). Dies wird von niemandem allgemein verwendet.
Fall Nr. 4 ist identisch mit Fall Nr. 3, aber die Anweisungen innerhalb des Blocks werden zur Kompilierzeit auf Syntaxfehler überprüft.
2. Umgang mit regulären Ausdrücken mit Eval
Mit der Verwendung von eval können wir die Anzahl der Zeilen im Code erheblich reduzieren, wenn die Zeile für mehr als eine Anzahl regulärer Ausdrücke übereinstimmen muss.
Die Liste der regulären Ausdrücke kann in einen Container (Hash / Array) gestellt werden, und in einer Schleife können die regulären Ausdrücke einzeln genommen und wie unten gezeigt mit der Eingabezeile abgeglichen werden.
$line = <>; %hash = ( number => qr/^[0-9]+$/, alphabets => qr/^[a-zA-Z]+$/ ); while( my ($key,$value) = each(%hash) ) { if(eval "$line =~ /$value/") { print "$key\n"; } }
3. Perl Eval Error Handling – Fehler abfangen
Eval wird verwendet, um die Fehler abzufangen. Während der Ausführung des Unterprogramms kann das Programm aufgrund von Fehlern oder externem Aufruf der Funktion abbrechen. Wenn während dieser Zeit der Perl-Code-Block innerhalb von eval ausgeführt wird, läuft das Programm auch nach dem Die oder den Fehlern weiter und erfasst auch die Fehler oder sterbenden Wörter.
Nullteilungsfehler:
eval { $average = $total / $count }; print “Error captured : $@\n”;
Oben enthält $count den Wert 0. Wenn wir den Code ohne den eval-Block ausführen, wird das Programm beendet.
Run After Die
sub func { die “dieing in subroutine func\n”; } eval { func(); }; print “Error captured : $@\n”;
Perl eval kann folgende Fehler nicht abfangen:
- Nicht erfasstes Signal
- Speichermangel
- Syntaxfehler
4. Dynamischer Perl-Code mit Eval
Eval kann zur Laufzeit Code aus einem String kompilieren und ausführen. Wir können also das dynamische Perl-Programm mit eval schreiben.
print “Enter number 1 : ”; $data1 = ; print “Enter number 2 : ”; $data2 = ; print “Enter operator : ”; $operator = ; $str = “$data1 $operator $data2”; $result = eval “$data1 $operator $data2”;
Wir können eine beliebige Anzahl von Anweisungen in eval ausführen. Das Ergebnis der Auswertung ist der zuletzt ausgewertete Ausdruck.
Wir sollten bei der Verwendung von eval auf einen String vorsichtig sein, da es nicht vertrauenswürdige Daten aus einem String ausführen könnte. Wenn die Zuweisungsoperationen im String selbst durchgeführt werden müssen, sollten wir auf den Umgang mit dem lvalue achten.
$str = “\$result = $data1 $operator $data2”; eval { $str };
5. Perl-Skript während der Laufzeit aus einer Datei oder Subroutine einfügen
In Perl können wir Module zur Laufzeit dynamisch laden. Um Module dynamisch zu laden, müssen wir „require“ (nicht „use“) verwenden.
Beispielcode zum Laden des Moduls, wenn die Eingabedatei komprimiert ist,
$filetype = `file $InputFile`; if($filetype =~ /gzip compressed/) { print "compressed input file...\n"; eval { require PerlIO::gzip; }; }
Gemeinsame Subroutinen, die in den Programmen verwendet werden, können in eine Datei aufgeteilt werden, die in die Perl-Programme durch eval geladen werden kann, wie unten gezeigt.
File : common_routines.pl sub open_file { .... } sub read_file { .... } sub write_file { .... } sub close_file { .... } In the perl script, sub load_file_subroutines { open CODE, 'common_routines.pl'; undef $\; my $code = <code>; close CODE; eval $code; die $@ if $@; }</code>
6. Perl-Auswertung in Eingabe-Timeouts
Die Alarm-Standardbibliotheksfunktion wird verwendet, um nach einer bestimmten Zeit ein SIGALRM-Signal zu erzeugen. Dies würde uns hauptsächlich helfen, das blockierende Warten auf die Benutzereingabe zu vermeiden. Dies kann mit eval verwendet werden, um die Benutzereingabe innerhalb einer bestimmten Zeit zu erhalten, wie im Beispiel unten gezeigt.
$SIG{ALRM} = \&input_timed_out; eval { alarm (10); $buf = <>; alarm(0); # Cancel the pending alarm if user responds. }; if ($@ =~ /NO USER INPUT IN TIME/) { print "Timed out.\n"; } sub input_timed_out { die "NO USER INPUT IN TIME"; }