GNU/Linux >> Tutoriels Linux >  >> Linux

6 Exemples de fonctions Perl Eval - Regex, gestion des erreurs, Require, Timeout, Dynamic Code

La fonction intégrée Perl eval est très puissante. Dans cet article, examinons comment utiliser regex dans eval, piéger les erreurs à l'aide d'eval, créer du code dynamique à l'aide d'eval, insérer un code à partir d'un fichier/sous-routine à l'aide d'eval etc.,

La forme générale de perl eval attend une expression ou un bloc de code comme argument.

1. Différences entre les diverses instructions Perl Eval

Considérons l'extrait de code perl suivant :

$expr ='$a + $b';
eval $expr; # 1
eval "$expr" ; # 2
eval '$expr' ; # 3
eval { $expr } ; #4

Les cas n°1 et n°2 sont identiques où perl les identifie comme une instruction exécutable valide et évalue l'expression. Ainsi, le résultat serait "30".

Dans le cas #3, l'expression ne peut pas être développée. Ainsi, cela donne l'expression réelle ($a + $b) en conséquence. Cela ne sera couramment utilisé par personne.

Le cas n°4 est identique au cas n°3, mais les instructions à l'intérieur du bloc sont validées pour les erreurs de syntaxe au moment de la compilation.

2. Gestion des expressions régulières avec Eval

Avec l'utilisation d'eval, nous pouvons réduire considérablement le nombre de lignes dans le code lorsqu'il doit faire correspondre la ligne pour plus d'un certain nombre d'expressions régulières.

La liste des expressions régulières peut être placée dans un conteneur (hachage / tableau), et dans une boucle, les expressions régulières peuvent être prises une par une et correspondent à la ligne d'entrée comme indiqué ci-dessous.

$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. Gestion des erreurs Perl Eval - Erreurs de piégeage

Eval est utilisé pour intercepter les erreurs. Pendant l'exécution de la sous-routine, le programme peut mourir à cause d'erreurs ou d'un appel externe de la fonction die. Pendant ce temps, si le bloc de code perl est exécuté à l'intérieur de l'eval, le programme continue de s'exécuter même après la mort ou les erreurs, et il capture également les erreurs ou les derniers mots.

Erreur de division par zéro :

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

Dans ce qui précède, $count contient la valeur 0. Lorsque nous exécutons le code sans le bloc eval, le programme obtient une sortie.

Courir après mourir

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

Perl eval ne peut pas détecter les erreurs suivantes :

  • Signal non capté
  • Manque de mémoire
  • Erreurs de syntaxe

4. Code Perl dynamique utilisant Eval

Eval peut compiler et exécuter du code à partir d'une chaîne lors de l'exécution. Ainsi, nous pouvons écrire le programme perl dynamique en utilisant eval.

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

Nous pouvons exécuter n'importe quel nombre d'instructions dans eval. Le résultat de eval est la dernière expression évaluée.

Nous devons être prudents lorsque nous utilisons eval sur une chaîne, car il pourrait exécuter des données non fiables à partir d'une chaîne. Si les opérations d'affectation doivent être effectuées dans la chaîne elle-même, nous devons faire attention à la manipulation de la lvalue.

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

5. Insertion d'un script Perl à partir d'un fichier ou d'un sous-programme pendant l'exécution

En perl, nous pouvons charger dynamiquement des modules au moment de l'exécution. Pour charger les modules dynamiquement, nous devons utiliser "require" (et non "use").
Exemple de code pour charger le module lorsque le fichier d'entrée est compressé,

$filetype = `file $InputFile`;

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

Les sous-programmes communs utilisés dans les programmes peuvent être séparés dans un fichier qui peut être chargé dans les programmes perl par eval comme indiqué ci-dessous.

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 dans les délais d'attente d'entrée

La fonction de bibliothèque standard d'alarme est utilisée pour générer le signal SIGALRM après un certain temps. Cela nous aiderait principalement à éviter l'attente bloquante sur l'entrée de l'utilisateur. Cela peut être utilisé avec eval pour obtenir l'entrée de l'utilisateur dans un délai spécifié, comme indiqué dans l'exemple ci-dessous.

$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. Gestion des erreurs dans les scripts Bash

  2. Impossible de localiser l'erreur Perl Test/Harness.pm :[Solution]

  3. Erreur Perl :le module PERL XML-Parser nécessite expat-devel

  4. Le module PERL DB_File nécessite db4-devel [Réparer]

  5. Comment appeler la fonction C en C++, la fonction C++ en C (mélanger C et C++)

Explication de la commande Linux timeout pour les débutants (avec exemples)

Bash Scripting - Fonctions expliquées avec des exemples

Tutoriel Regex pour les exemples Linux (Sed &AWK)

10 exemples pratiques de regex avec grep

Tutoriel sur les fonctions Bash Shell avec 6 exemples pratiques

Valeur de retour de la fonction de temporisation