¿Cómo puedo encontrar el directorio de inicio de un usuario en Perl?

Necesito verificar si existe un archivo en el directorio de inicio de un usuario, así que use la verificación de archivos:

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

Aunque hay un archivo llamado foo.txt en el directorio de inicio del usuario, Perl siempre se queja de que no existe dicho archivo o directorio. Cuando reemplazo “~” con / home / jimmy (supongamos que el usuario es jimmy), Perl da el veredicto correcto.

¿Podría explicar por qué “~” no funciona en Perl y decirme cuál es la forma de Perl de encontrar el directorio de inicio de un usuario?

    ~ es un basismo, más que un perlismo, por lo que no funciona. Dado que parece estar en un sistema de tipo UNIX, probablemente la solución más fácil sea ​​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 luego supongo que saben lo que están haciendo. Si no, se merecen todo lo que obtienen 🙂

    Si desea hacerlo de la manera correcta , puede buscar en File :: HomeDir , que es mucho más conocedor de la plataforma. Puedes verlo en acción en el siguiente script chkfile.pl :

     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 transcripción:

     pax $ touch ~ / foo.txt;  perl chkfile.pl
     Sí, existe!
    
     pax $ rm -rf ~ / foo.txt;  perl chkfile.pl
     No, no!
    

    No estoy seguro de cómo todos se perdieron File :: HomeDir . Es una de esas tareas difíciles que suenan fáciles porque nadie conoce todas las ridículas excepciones en las que tienes que pensar. No viene con Perl, por lo que debe instalarlo usted mismo.

    Una vez que conozca el directorio principal, cree la ruta que necesita con File :: Spec :

      use File::HomeDir qw(home); use File::Spec::Functions qw(catfile); print "The path is ", catfile( home(), 'foo.txt' ), "\n"; 

    Puedes englobar la tilde, glob('~/foo.txt') debería funcionar. O puede usar el módulo File :: Save :: Home que también debería ocuparse de otros sistemas.

    El directorio de inicio para un usuario se almacena en /etc/passwd . La mejor forma de acceder a la información es con las funciones getpw* :

     #!/usr/bin/perl use strict; use warnings; print "uid:", (getpwuid 501)[7], "\n", "name:", (getpwnam "cowens")[7], "\n"; 

    Para abordar su problema específico, pruebe este código:

     if ( -e (getpwuid $>)[7] . "/foo.txt" ) { print "yes ,it exists!"; } 

    Pruebe File::Path::Expand .