Question

Je dois vérifier si un fichier dans un répertoire personnel de l'utilisateur existe donc utiliser la vérification du fichier:

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

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

Pourriez-vous expliquer pourquoi « ~ » travail de doesnt en Perl et me dire quelle est la façon de Perl trouver le répertoire d'un utilisateur?

Était-ce utile?

La solution

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

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

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

Si vous voulez faire le droit façon, vous pouvez regarder dans fichier :: HomeDir , ce qui est beaucoup plus plate-forme savvy. Vous pouvez le voir en action dans le chkfile.pl de script suivant:

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
Yes, it exists!

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

Autres conseils

Je ne sais pas comment tout le monde a manqué File :: HomeDir . Il est l'une de ces tâches difficiles qui sonnent facile parce que personne ne connaît toutes les exceptions loufoques que vous devez penser. Il ne vient pas avec Perl, vous devez installer vous-même.

Une fois que vous connaissez le répertoire, construire le chemin que vous avez besoin avec fichier :: Spec :

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

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

Vous pouvez Glob le tilde, glob('~/foo.txt') devrait fonctionner. Ou vous pouvez utiliser le File :: Enregistrer :: Accueil module qui devrait aussi prendre soin d'autres systèmes.

Le répertoire d'un utilisateur est stocké dans /etc/passwd. La meilleure façon d'obtenir l'information sont les fonctions de getpw* :

#!/usr/bin/perl 

use strict;
use warnings;

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

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

if ( -e (getpwuid $>)[7] . "/foo.txt" ) {
   print "yes ,it exists!";
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top