2011-10-11 18 views
6

Soy consciente de que puede probar si un archivo es un directorio usando:prueba si el archivo no es un directorio en Perl

if(-d $filename) 

pero ¿cómo se puede probar si no es un directorio?

+2

posible duplicado de [¿Cómo distingo un archivo desde un directorio en Perl?] (Http://stackoverflow.com/questions/206320/how-do-i-distinguish-a-file-from- a-directory-in-perl) –

+1

La pregunta canónica sobre el desbordamiento de pila es * [¿Cómo distingo un archivo de un directorio en Perl?] (http://stackoverflow.com/questions/206320) *. –

Respuesta

15

¿Has pensado en probar lo siguiente?

if (! -d $filename) ... 

El resultado de -d es, después de todo, algo que puede ser entendido como un valor booleano, por lo tanto, la lógica no operador ! funcionará bien.

Y, si busca algo más más específico que "no es un directorio", consulte here. Hay bastantes cosas que no son directorios que a veces no tiene sentido tratar como archivos regulares.

Tenga en cuenta que es suponiendo que ya ha validado que existe el nombre de archivo . Si hace un ! -d en un nombre de archivo inexistente, devolverá verdadero.

Es una cuestión filosófica de si se tiene en cuenta una cosa inexistente a ser "no es un directorio", pero, si usted quiere asegurarse de que existe, así, puede utilizar ! -d conjuntamente con -e, algo así como:

if ((-e $filename) && (! -d $filename)) ... 
+3

No pude llegar a 30 caracteres lo suficientemente rápido ...Creo que la pregunta realmente me sorprendió. –

+2

Tenga en cuenta que, dependiendo de cómo analice las necesidades de OP, esta respuesta puede ser incorrecta. La forma en que lo analicé, él quiere saber si algo es un archivo PERO no un directorio; esta respuesta sería verdadera incluso para algo que NO es un archivo en primer lugar (por ejemplo, '! -d NO_SUCH_FILE' devuelve verdadero). – DVK

+0

@DVK, buen punto en eso, respuesta actualizada para adaptarse. – paxdiablo

2

El operador -f prueba para ver si algo es un "archivo normal". Esto excluye los directorios, pero también excluye cosas como las tuberías y los nodos de los dispositivos.

if (-f $filename) { ... 
3

En el espíritu de TIMTOWTDI:

unless (-d $filename) 
+0

Muy elegante aunque – Pavel

5

Para probar si algo es un archivo, pero no es un directorio, es necesario simplemente combinar las 2 pruebas (no existe una prueba única):

if (-e $file && !-d $file) { # a file but not a directory } 

Tenga en cuenta que:

  • Con el debido respeto, la respuesta de paxdiablo está mal por la forma está redactada la pregunta (pura !-d no funciona para lo que el usuario solicitó la que comprueba si una cosa aleatoria/cadena no es un directorio, no es si algo es un archivo que no es un directorio). P.ej. !-d NO_SUCH_FILE devuelve verdadero.

  • La respuesta de Greg puede ser correcta dependiendo completamente de si el usuario original incluía archivos no simples (por ejemplo, enlaces simbólicos, canalizaciones con nombre, etc.) en su definición de "archivo que no es un directorio". Si quisieron incluir todos esos "archivos" especiales, la respuesta de Greg también es errónea ya que "-f" los excluye (como Greg notó sabiamente en su respuesta en primer lugar).

Cuestiones relacionadas