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