GNU/Linux >> Tutoriales Linux >  >> Linux

6 ejemplos de funciones de Perl Eval:expresión regular, manejo de errores, requisito, tiempo de espera, código dinámico

La función integrada Perl eval es muy potente. En este artículo, revisemos cómo usar regex en eval, atrapar errores usando eval, crear código dinámico usando eval, insertar un código de un archivo/subrutina usando eval, etc.,

La forma general de perl eval espera una expresión o un bloque de código como argumento.

1. Diferencias entre varias declaraciones de Perl Eval

Consideremos el siguiente fragmento de código perl:

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

Los casos n.° 1 y n.° 2 son idénticos cuando perl los identifica como una instrucción ejecutable válida y evalúa la expresión. Entonces, produciría el resultado como "30".

En el caso #3, la expresión no se puede expandir. Entonces, da como resultado una expresión real ($a + $b). Esto no será comúnmente utilizado por nadie.

El caso n.º 4 es idéntico al caso n.º 3, pero las declaraciones dentro del bloque se validan por errores de sintaxis en tiempo de compilación.

2. Manejo de expresiones regulares con Eval

Con el uso de eval, podemos reducir considerablemente la cantidad de líneas en el código cuando necesita coincidir con la línea para más de una cantidad de expresiones regulares.

La lista de expresiones regulares se puede colocar en un contenedor (hash/matriz) y, en un ciclo, las expresiones regulares se pueden tomar una por una y coincidir con la línea de entrada, como se muestra a continuación.

$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. Manejo de errores de Perl Eval:errores de captura

Eval se utiliza para atrapar los errores. Durante la ejecución de la subrutina, el programa puede morir debido a errores o llamadas externas a la función. Durante este tiempo, si el bloque de código perl se ejecuta dentro de la evaluación, el programa continúa ejecutándose incluso después de la muerte o los errores, y también captura los errores o las palabras muertas.

Error de división cero:

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

En lo anterior, $count contiene el valor 0. Cuando ejecutamos el código sin el bloque eval, el programa sale.

Corre tras morir

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

Perl eval no puede detectar los siguientes errores:

  • Señal no captada
  • Quedarse sin memoria
  • Errores de sintaxis

4. Código Perl dinámico usando Eval

Eval puede compilar y ejecutar código desde una cadena en tiempo de ejecución. Entonces, podemos escribir el programa perl dinámico 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”;

Podemos ejecutar cualquier número de sentencias en eval. El resultado de la evaluación es la última expresión evaluada.

Debemos tener cuidado al usar eval en una cadena, ya que podría ejecutar datos no confiables desde una cadena. Si las operaciones de asignación deben realizarse en la propia cadena, debemos tener cuidado al manejar el valor l.

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

5. Inserción de secuencias de comandos Perl desde un archivo o subrutina durante el tiempo de ejecución

En perl podemos cargar módulos dinámicamente en tiempo de ejecución. Para cargar módulos dinámicamente, tenemos que usar "requerir" (no "usar").
Código de muestra para cargar el módulo cuando el archivo de entrada está comprimido,

$filetype = `file $InputFile`;

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

Las subrutinas comunes que se utilizan en los programas se pueden separar en un archivo que se puede cargar en los programas perl mediante eval, como se muestra a continuación.

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 en tiempos de espera de entrada

La función de biblioteca estándar de alarma se utiliza para generar una señal SIGALRM después de un tiempo determinado. Esto nos ayudaría principalmente a evitar la espera de bloqueo en la entrada del usuario. Esto se puede usar con eval para obtener la entrada del usuario dentro de un tiempo específico, como se muestra en el siguiente ejemplo.

$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. Aprenda el manejo de errores de Bash con el ejemplo

  2. No se puede localizar Test/Harness.pm perl Error:[Solución]

  3. Error de Perl:el módulo PERL XML-Parser requiere expat-devel

  4. El módulo PERL DB_File requiere db4-devel [Fijar]

  5. Cómo llamar a la función C en C++, función C++ en C (Mezclar C y C++)

Comando de tiempo de espera de Linux explicado para principiantes (con ejemplos)

Bash Scripting - Funciones explicadas con ejemplos

Tutorial de expresiones regulares para ejemplos de Linux (Sed y AWK)

10 ejemplos prácticos de expresiones regulares con grep

Tutorial de funciones de Bash Shell con 6 ejemplos prácticos

si con expresiones regulares en código bash