52 votes

Comment trouver le répertoire de base d'un utilisateur dans Perl?

J'ai besoin de vérifier si un fichier dans un répertoire home de l'utilisateur existe donc utiliser un fichier:

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

Même si il y a un fichier appelé foo.txt sous le répertoire home de l'utilisateur, Perl toujours se plaint qu'il n'y a aucun fichier ou répertoire. Lorsque je remplace "~" avec /home/jimmy (disons que l'utilisateur est jimmy) puis Perl donner le droit verdict.

Pourriez-vous expliquer pourquoi "~" ne marche pas de travail en Perl et dites-moi qu'est-ce que Perl est la façon de trouver un répertoire home de l'utilisateur?

75voto

paxdiablo Points 341644

~ est bash-ism plutôt qu'un perl-ism, qui est pourquoi il ne fonctionne pas. Étant donné que vous semblez être sur un UNIX-système de type, probablement la plus simple solution consiste à utiliser l' $HOME variable d'environnement, tels que:

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

Et oui, je sais, l'utilisateur peut modifier leur $HOME variable d'environnement mais alors, je suppose qu'ils savent ce qu'ils font. Si pas, ils méritent tout ce qu'ils obtiennent :-)

Si vous souhaitez faire le droit chemin, vous pouvez regarder dans le Fichier::HomeDir, ce qui est beaucoup plus de la plate-savvy. 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 la transcription:

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

pax$ rm -rf ~/foo.txt ; perl chkfile.pl
Non, il n'est pas!

59voto

brian d foy Points 71781

Je ne suis pas sûr de savoir comment tout le monde a raté File :: HomeDir . C’est l’une de ces tâches difficiles qui paraissent faciles car personne ne connaît toutes les exceptions loufoques auxquelles vous devez penser. 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";
 

19voto

zoul Points 51637

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

11voto

Chas. Owens Points 40887

Le répertoire de base d'un utilisateur est stocké dans /etc/passwd . Le meilleur moyen d’obtenir des informations est le getpw* fonctions :

 #!/usr/bin/perl 

use strict;
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!";
}
 

7voto

phoebus Points 7358

Essayez File::Path::Expand .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X