Variables de Perl: anotaciones
Es muy recomendable el uso del módulo English de cara a la legilibilidad del código y su posterior mantenimiento.
Por ello en las siguientes anotaciones vamos a situar el nombre canónico de la variable, seguido por el nombre largo de la misma entre paréntesis.
$_ ($ARG)
Contiene el valor de entrada predeterminado, así como el patrón de búsqueda por omisión.
Hay varios lugares donde Perl emplea esta variable incluso si no se usa explícitamente:
- Varias funciones unarias como ord e int, y varios test sobre archivos (-f, -d) excepto -t, el cuál usa STDIN.
- Varias funciones de listas como print y unlink.
- Operaciones con patrones de búsqueda como m//, s/// y tr/// cuando se emplean sin el operador =~.
- La variable de iteración de bucle en foreach si no se le proporciona otra.
- La variable implícita de iteración en grep y map.
- El lugar predeterminado donde almacenar un registro leído mediante
operaciones con
<FH>
.
$/ ($INPUT_RECORD_SEPARATOR)
También accesibles como $RS
e IO::Handle->input_record_separator(EXPR)
.
Determina para Perl en qué consiste una línea de datos; el valor predeterminado es el caŕacter nueva línea ('\n'). Contiene uno ó varios caracteres que son los que forman el final de registro cuando se leen datos (no es, pues, una expresión regular).
Dependiendo del contenido de esta variable, Perl leerá datos de forma distinta:
- Si contiene una cadena nula ('') tratará una ó más líneas vacías como separador de registro. Se entiende una línea vacía como aquella que no contiene ningún espacio ni tabulado.
- Si no está definida (valor undef) Perl asumirá que el final de registro es el final del archivo.
- Si apunta a una referencia a un número entero, a una variable escalar conteniendo un entero ó a un escalar que puede convertirse en número entero, Perl leerá registros de longitud fija, determinados por dicho valor numérico; es decir, de no más de N bytes de longitud.
$\ ($OUTPUT_RECORD_SEPARATOR)
También conocido como $ORS
e IO::Handle->output_record_separator(EXPR)
.
Separador de registros para el operador print. Si contiene un valor, éste será impreso tras el último argumento.
$? ($CHILD_ERROR)
El valor devuelto por una de las siguientes operaciones:
- El último cierre de una tubería
- La ejecución de un programa mediante backticks (\
programa\
) - Una ejecución satisfactoria de las funciones wait ó waitpid
- El operador system.
En realidad este valor es una palabra de 16 bits devuelta por la función
wait, por lo que el valor de salida real del proceso se obtiene
desplazando 8 bits a la derecha el valor ($? >> 8
). Además es posible
obtener el número de señal que provocó la finalización del programa aplicando
la siguiente operación $? & 127
. Otro dato que puede obtenerse es si el
proceso generó o no un dump mediante $? & 128
.
Un ejemplo de cómo usar ésto es el siguiente fragmento:
1 sub run_command { 2 my $cmd = shift; 3 4 system($cmd); 5 6 my $exit_code = $? >> 8; 7 8 return $exit_code; 9 }
$! ($ERRNO, $OS_ERROR)
Si se usa como un número, guarda el valor de la variable C errno, lo que equivale a tener el valor de la última llamada a una biblioteca del sistema. Así pues, sólo tiene sentido inmediatamente después de un fallo, y conviene recordar que una llamada exitosa al sistema no inicializa este valor a cero.
Cuando se emplea como un texto guarda el correspondiente mensaje de error en lugar de sólo su número.
$^E ($EXTENDED_OS_ERROR)
Información de error específica para el sistema operativo donde funciona. Sólo
existen algunos en los que su valor difiere del de $ERRNO
(como en Windows, MacOS y VMS).
$@ ($EVAL_ERROR)
El mensaje de error sintáctico de Perl tras la última llamada al operador eval. Si contiene un valor nulo es que todo ha ido bien en la carga, anaálisis y ejecución del código, aunque dicho código haya fallado por otras causas.
Los mensajes de aviso no son conservados en esta variable; pero es posible
fijar una función en el gestor de interrupciones $SIG{WARN}
para que se haga
cargo de ellas.
$0 ($PROGRAM_NAME)
Contiene el nombre del programa que está ejecutándose.