Comment trouver le répertoire personnel d’un utilisateur dans Perl?

J’ai besoin de vérifier si un fichier dans le répertoire de base d’un utilisateur existe, alors utilisez la vérification de fichier:

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

Même s’il existe un fichier appelé foo.txt dans le répertoire personnel de l’utilisateur, Perl se plaint toujours de l’absence d’un tel fichier ou répertoire. Lorsque je remplace “~” par / home / jimmy (disons que l’utilisateur est jimmy), Perl donne le bon verdict.

Pourriez-vous expliquer pourquoi “~” ne fonctionne pas dans Perl et me dire quel est le moyen de Perl pour trouver le répertoire personnel d’un utilisateur?

~ est un bash -isme plutôt qu’un perlisme, ce qui explique pourquoi cela ne fonctionne pas. Étant donné que vous semblez être sur un système de type UNIX, la solution la plus simple est probablement d’utiliser la variable d’environnement $HOME , telle que:

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

Et oui, je sais que l’utilisateur peut changer la variable d’environnement $HOME , mais je suppose qu’il sait ce qu’il fait. Sinon, ils méritent tout ce qu’ils obtiennent 🙂

Si vous voulez le faire correctement , vous pouvez regarder dans File :: HomeDir , qui est beaucoup plus adapté aux plates-formes. Vous pouvez le voir en action dans le script suivant 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"; } 

et transcription:

 pax $ touch ~ / foo.txt;  perl chkfile.pl
 Oui, ça existe!

 pax $ rm -rf ~ / foo.txt;  perl chkfile.pl
 Non, pas du tout!

Je ne sais pas comment tout le monde a manqué File :: HomeDir . C’est l’une de ces tâches difficiles qui semblent faciles à réaliser, car personne ne connaît toutes les exceptions que l’on doit avoir. Il ne vient pas avec Perl, vous devez donc l’installer vous-même.

Une fois que vous connaissez le répertoire de base, construisez le chemin dont vous avez besoin avec File :: Spec :

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

Vous pouvez globaliser le tilde, glob('~/foo.txt') devrait fonctionner. Ou vous pouvez utiliser le module File :: Save :: Home qui devrait également prendre en charge d’autres systèmes.

Le répertoire personnel d’un utilisateur est stocké dans /etc/passwd . La meilleure façon d’obtenir les informations est les fonctions getpw* :

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

Pour résoudre votre problème spécifique, essayez ce code:

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

Essayez File::Path::Expand .