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
olstat
) recibe ellstat
de archivo especial que consiste en un subrayado solitario, se usa la estructurastat
de la prueba de archivo anterior (o operadorstat
), 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 _
.