GNU/Linux >> LINUX-Kenntnisse >  >> Linux

6 Beispiele für Perl-Eval-Funktionen – Regex, Fehlerbehandlung, Require, Timeout, Dynamischer Code

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";
}

Linux
  1. Fehlerbehandlung in Bash-Skripten

  2. Kann Test/Harness.pm Perl-Fehler nicht finden:[Lösung]

  3. Perl-Fehler:PERL-XML-Parser-Modul erfordert expat-devel

  4. Das PERL DB_File-Modul erfordert db4-devel [Fix]

  5. Aufrufen von C-Funktionen in C++, C++-Funktionen in C (C und C++ mischen)

Linux-Timeout-Befehl für Anfänger erklärt (mit Beispielen)

Bash Scripting – Funktionen mit Beispielen erklärt

Regex-Tutorial für Linux-Beispiele (Sed &AWK).

10 praktische Beispiele für Regex mit grep

Tutorial zu Bash-Shell-Funktionen mit 6 praktischen Beispielen

wenn mit Regex im Bash-Code