GNU/Linux >> Linux Esercitazione >  >> Linux

6 Esempi di funzioni di valutazione Perl:Regex, gestione degli errori, richiesta, timeout, codice dinamico

La funzione incorporata di Perl eval è molto potente. In questo articolo esaminiamo come usare regex in eval, intercettare gli errori usando eval, creare codice dinamico usando eval, inserire un codice da un file/sottoprogramma usando eval ecc.,

La forma generale di perl eval si aspetta un'espressione o un blocco di codice come argomento.

1. Differenze tra le varie dichiarazioni di valutazione di Perl

Consideriamo il seguente snippet di codice Perl:

$espr ='$a + $b';
eval $espr; # 1
eval “$espr”; # 2
eval '$espr'; # 3
eval { $espr }; # 4

I casi #1 e #2 sono identici quando perl li identifica come un'istruzione eseguibile valida e valuta l'espressione. Quindi, produrrebbe il risultato come "30".

Nel caso n. 3, l'espressione non può essere espansa. Di conseguenza, fornisce un'espressione effettiva ($a + $b). Questo non sarà comunemente usato da nessuno.

Il caso n. 4 è identico al caso n. 3, ma le istruzioni all'interno del blocco vengono convalidate per errori di sintassi in fase di compilazione.

2. Gestione delle espressioni regolari con Eval

Con l'uso di eval, possiamo ridurre considerevolmente il numero di righe nel codice quando deve corrispondere alla riga per più di un numero di espressioni regolari.

L'elenco delle espressioni regolari può essere inserito in un contenitore (hash/array) e in un ciclo le espressioni regolari possono essere prese una per una e corrispondere alla riga di input come mostrato di seguito.

$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. Gestione degli errori di valutazione Perl – Trapping degli errori

Eval viene utilizzato per intercettare gli errori. Durante l'esecuzione della subroutine il programma potrebbe morire a causa di errori o di chiamate esterne della funzione die. Durante questo periodo, se il blocco di codice perl viene eseguito all'interno di eval, il programma continua a essere eseguito anche dopo il die o gli errori e cattura anche gli errori o le parole dieing.

Errore di divisione zero:

eval  { $average =  $total / $count };
print “Error captured : $@\n”;

In quanto sopra, $count contiene il valore come 0. Quando eseguiamo il codice senza il blocco eval, il programma esce.

Corri dopo la morte

sub func
{
die “dieing in subroutine func\n”;
}
eval { func(); };
print “Error captured : $@\n”;

Perl eval non riesce a rilevare i seguenti errori:

  • Segnale non rilevato
  • Memoria insufficiente
  • Errori di sintassi

4. Codice Perl dinamico utilizzando Eval

Eval può compilare ed eseguire codice da una stringa in fase di esecuzione. Quindi, possiamo scrivere il programma Perl dinamico usando eval.

print “Enter number 1 : ”;
$data1 = ;
print “Enter number 2 : ”;
$data2 = ;
print “Enter operator : ”;
$operator = ;
$str = “$data1 $operator $data2”;
$result = eval “$data1 $operator $data2”;

Possiamo eseguire un numero qualsiasi di istruzioni in eval. Il risultato di eval è l'ultima espressione valutata.

Dovremmo fare attenzione nell'usare eval su una stringa, poiché potrebbe eseguire dati non attendibili da una stringa. Se le operazioni di assegnazione devono essere eseguite nella stringa stessa, dovremmo fare attenzione a gestire lvalue.

$str = “\$result = $data1 $operator $data2”;
eval { $str };

5. Inserimento di script Perl da un file o da una subroutine durante l'esecuzione

In perl possiamo caricare dinamicamente i moduli in fase di esecuzione. Per caricare i moduli in modo dinamico, dobbiamo usare "require" (non "use").
Codice di esempio per caricare il modulo quando il file di input è compresso,

$filetype = `file $InputFile`;

if($filetype =~ /gzip compressed/) {
print  "compressed input file...\n";
eval { require PerlIO::gzip; };
}

Le subroutine comuni utilizzate nei programmi possono essere separate in un file che può essere caricato nei programmi perl tramite eval come mostrato di seguito.

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 Eval nei timeout di input

La funzione di libreria standard allarmi permette di generare il segnale SIGALRM dopo un certo tempo. Questo ci aiuta principalmente a evitare l'attesa di blocco sull'input dell'utente. Questo può essere utilizzato con eval per ottenere l'input dell'utente entro un tempo specificato, come mostrato nell'esempio seguente.

$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. Gestione degli errori negli script Bash

  2. Impossibile individuare Test/Harness.pm perl Errore:[Soluzione]

  3. Errore Perl:il modulo PERL XML-Parser richiede expat-devel

  4. Il modulo PERL DB_File richiede db4-devel [fissare]

  5. Cos'è :-!! in codice C?

Spiegazione del comando di timeout di Linux per i principianti (con esempi)

Bash Scripting:funzioni spiegate con esempi

Tutorial Regex per esempi di Linux (Sed e AWK).

10 esempi pratici di regex con grep

Tutorial sulle funzioni di Bash Shell con 6 esempi pratici

if con regex nel codice bash