Pregunta

Tengo que comprobar si un archivo en el directorio principal de un usuario existe a fin de utilizar la comprobación del archivo:

if ( -e "~/foo.txt" ) {
   print "yes, it exists!" ;
}

A pesar de que existe un archivo llamado foo.txt en el directorio inicial del usuario, Perl siempre se queja de que no existe tal archivo o directorio. Si se sustituyen "~" con / home / Jimmy (digamos que el usuario es Jimmy), entonces Perl dar el veredicto derecha.

Podría explicar por qué "~" trabajo dosen't en Perl y dime lo que es la forma de Perl para encontrar el directorio principal de un usuario?

¿Fue útil?

Solución

~ es un bash-ismo en lugar de un perl-ismo, por lo que no está funcionando. Teniendo en cuenta que usted parece estar en un sistema de tipo UNIX, probablemente el más fácil solución es utilizar la variable de entorno $HOME, como por ejemplo:

if ( -e $ENV{"HOME"} . "/foo.txt" ) {
    print "yes ,it exists!" ;
}

Y sí, sé que el usuario puede cambiar su variable de entorno $HOME pero entonces yo supongo que saben lo que están haciendo. Si no, que se merecen todo lo que obtienen: -)

Si desea hacerlo de la derecho manera, se puede mirar en archivo :: HomeDir , que es una plataforma mucho más conocedores. Puede verlo en acción en el siguiente chkfile.pl script:

use File::HomeDir;
$fileSpec = File::HomeDir->my_home . "/foo.txt";
if ( -e $fileSpec ) {
    print "Yes, it exists!\n";
} else {
    print "No, it doesn't!\n";
}

y la transcripción:

pax$ touch ~/foo.txt ; perl chkfile.pl
Yes, it exists!

pax$ rm -rf ~/foo.txt ; perl chkfile.pl
No, it doesn't!

Otros consejos

No estoy seguro de cómo todo el mundo se perdió Archivo :: HomeDir . Es una de esas tareas duras que suenan fácil porque no se sabe acerca de todas las excepciones tontas que hay que pensar. No viene con Perl, por lo que necesita para instalar usted mismo.

Una vez conocido el directorio principal, construir el camino que necesita con el File :: Spec :

 use File::HomeDir qw(home);
 use File::Spec::Functions qw(catfile);

 print "The path is ", catfile( home(), 'foo.txt' ), "\n";

Puede Glob la tilde, glob('~/foo.txt') debería funcionar. O puede utilizar el archivo rel="noreferrer"> principal que debe también cuidar de otros sistemas.

El directorio principal de un usuario se almacena en /etc/passwd. La mejor manera de llegar a la información de las funciones es getpw* :

#!/usr/bin/perl 

use strict;
use warnings;

print "uid:", (getpwuid 501)[7], "\n",
    "name:", (getpwnam "cowens")[7], "\n";

Para hacer frente a su problema específico, prueba este código:

if ( -e (getpwuid $>)[7] . "/foo.txt" ) {
   print "yes ,it exists!";
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top