tutorial strawberry logo historia perl

strawberry - perl tutorial



¿Qué es_(guión bajo único) en Perl sin $ o @? (2)

Cuando llama a uno de los operadores de prueba de archivos ( -f , -d , -s , etc.), Perl realiza una llamada a la función stat del sistema operativo. La función stat devuelve una estructura llena de todo tipo de información interesante sobre el archivo en cuestión, pero cada uno de los operadores de prueba de archivos solo mira uno de los campos de esa estructura (¿es un archivo? ¿Es un directorio? ¿Qué tan grande es? ¿eso?)

Es común que desee obtener más información sobre un archivo (¿es un archivo ?, ¿puedo leerlo ?, ¿puedo ejecutarlo?). La forma ingenua de escribir es:

if (-f $file and -r $file and -x $file)

Pero eso hace tres llamadas a la stat , con cada una de ellas mirando solo uno de los campos de la estructura. Para mitigar eso, Perl es inteligente y almacena en caché los resultados de la última llamada a stat . Se almacena en caché contra el identificador de archivo especial _ . Entonces, una forma más eficiente de escribir el mismo código es:

if (-f $file and -r _ and -x _)

Eso solo hace una llamada a stat .

Desde Perl 5.10, también puede usar "pruebas de archivos apilados" y escribir este código como:

if (-x -r -f $file) # Note reversed order of operators

Actualización: perldoc dice esto sobre los operadores de archivos apilados.

A partir de Perl 5.10.0, como una forma de azúcar puramente sintáctica, puede apilar operadores de prueba de archivos, de modo que -f -w -x $file sea ​​equivalente a "-x $file && -w _ && -f _ . (Esta es solo una sintaxis sofisticada: si usa el valor de retorno del -f $file como argumento para otro operador de prueba de archivo, no se producirá ninguna magia especial.)

Tengo un código como este:

if (!-d _ || !-o _ || ($vncUserDirUnderTmp && ($mode & 0777) != 0700)) { raise Exception("$prog: Wrong type or access mode of $vncUserDir./n") }

Pude encontrar información sobre @_ y $_ en Perl, pero no sobre _ solo. ¿Qué significa en -d _ y -o _ aquí?


Cuando se usa con un operador de prueba de archivo (-X) , se usa la estructura stat de la prueba de archivo anterior

Si alguna de las pruebas de archivos (o el operador stat o lstat ) recibe el lstat de archivo especial que consiste en un subrayado solitario, se usa la estructura stat de la prueba de archivo anterior (o operador stat ), guardando una llamada al sistema.
...
Ejemplo:

stat($filename); print "Readable/n" if -r _; print "Writable/n" if -w _; ...

¡Entonces en su ejemplo !-d _ prueba si el último archivo estátizado no es un directorio.

Actualizar

El inusual _ es realmente un typeglob *_ pero con operadores que esperan un identificador de archivo *_ se puede omitir, como <*STDIN> puede escribirse como <STDIN> . Se encuentra en la tabla de símbolos

print *{$main::{_}}{IO}, "/n"; # --> IO::Handle=IO(0x2311970)

En una línea, *_ se configura solo después de realizar llamadas a stat y _ .