2010-12-10 4 views
2

J'ai créé un script Perl qui utilise abs_path mais il ne gère pas correctement le répertoire (représenté par « ~ »)abs_path avec le répertoire

EG si je tente d'appeler abs_path("~/mystuff");

retourne undef

Puis-je faire abs_path gérer correctement le répertoire personnel? Et sinon, y a-t-il une alternative que je peux utiliser?

+0

Faites-vous référence à 'abs_path' dans [Cwd] (http://search.cpan.org/perldoc?CWD)? – Ether

Répondre

5
#!/usr/bin/perl 

use File::HomeDir; 

print File::HomeDir->my_home; 
+0

Wow, je suis impressionné, il y a un module CPAN pour le faire! Bon travail! – DVK

2

La raison pour laquelle abs_path ne gère pas correctement, il est que « ~ » est une coquille construction. Perl ne sait rien de ce que "~" signifie - il le traite littéralement comme "un répertoire nommé 'tilde' (~) sous le répertoire de travail courant".

Tout programme auquel "~" est fourni en tant que paramètre obtiendrait réellement un chemin de répertoire réel à partir de shell. Pour pouvoir utiliser les répertoires personnels à partir de Perl, sous Unix, vous pouvez utiliser $ENV{HOME} au lieu de "~" pour votre propre répertoire personnel; ou pour les autres utilisateurs, utiliser (getpwnam($user))[7]; Il n'y a pas de façon propre de multiplateforme à faire.

Une deuxième approche consiste à utiliser shell pour le travail sale dans un appel système:

my $expanded_home_dir = `cd ~/mydir/; pwd`; 

MISE À JOUR:

D'abord, une très bonne recette pour le remplacement pur et simple des chaînes-maison-tilde est dans "Perl Cookbook" (2e éd.), ch. 7.3 "Expansion des tildes dans les noms de fichiers".

En second lieu, comme daxim mentionné dans les commentaires, depuis Perl 5.6, CORE::glob() est en fait automatiquement remplacé par File::Glob::bsd_glob()qui prend en charge GLOB_TILDE drapeau et peut donc de développer tilde Posix pour vous.

Il est intéressant, à la fois bsd_glob (en code C, comme par PerlMonks), et File::HomeDir mentionné à bon escient par Andrew Clark, utiliser exactement la même logique que sous la recette du livre de recettes 7,3 ($ENV{HOME}||$ENV{LOGDIR}||(getpwnam($<))[7]) pour les environnements Unix.

+0

['glob'] (http://p3rl.org/glob) existe. – daxim

+0

@daxim - IIRC, glob a seulement commencé à le soutenir depuis 5.6 (mon excuse pour ne pas me souvenir de ceci est que je m'occupe beaucoup de 5.005). – DVK

Questions connexes