Comment puis-je créer un chemin d'accès avec tous ses sous-répertoires d'un seul coup en Perl?
Si vous avez un chemin d'accès à un fichier (par exemple, /home/bob/test/foo.txt) où chaque sous-répertoire dans le chemin d'accès peut ou peut ne pas exister, comment puis-je créer le fichier foo.txt d'une manière qui utilise "/home/bob/test/foo.txt" comme la seule entrée à la place de la création de chaque inexistant répertoire dans le chemin un par un et enfin la création d'foo.txt elle-même?
OriginalL'auteur Haiyuan Zhang | 2009-08-25
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser File::Basename et Fichier::Chemin De
Je n'ai pas ajouter des tests pour voir si le fichier existe déjà, mais c'est assez facile d'ajouter avec Perl.
mkpath
, pasmake_path
? Sinon, bonne réponse.vérifiez la documentation pour
File::Path
.mkpath
est décrit comme "l'héritage", et la nouvelle interface utilisemake_path
pour cette fonction.Ah, c'est un changement récent. La version que j'ai n'a pas que de l'interface. 🙂
Pour ajouter, selon ce forum,
make_path
etremove_tree
ne sont disponibles que depuisFile::Path version 2.07
Où avez-vous défini le paramètre
$fh
?OriginalL'auteur seth
Utilisation make_dir du Fichier::Util
OriginalL'auteur Nifle
Je ne pense pas qu'il y a une fonction standard qui peut faire tout ce que vous demandez, directement à partir du nom de fichier.
Mais mkpath(), à partir du module File::Chemin d'accès, peut presque le faire étant donné le nom de fichier du répertoire. À partir de ce Fichier::Chemin de docs:
Noter que mkpath() ne signale pas les erreurs d'une belle manière: il meurt au lieu de juste retour de zéro, pour une raison quelconque.
Vu tout cela, vous pourriez faire quelque chose comme:
Bon à savoir il y a une nouvelle interface. Je suis habitué à avoir à écrire du Perl portable qui fonctionne pour les versions anciennes et à travers les Systèmes d'exploitation (par conséquent, les deux-arg open()), donc je n'ai pas l'habitude de taquiner moi-même, par l'apprentissage, ce qui est nouveau en Perl. 🙂
Je comprends que vous pourriez avoir besoin d'écrire ancien Perl pour quelque raison que ce soit, mais je ne comprends pas pourquoi vous poste le code à titre d'exemples pour les autres. Si vous êtes au courant des trois-argument forme de
open
, merci de l'utiliser ici. Nous n'avons pas besoin de plus d'exemples sur le net des deux-argument de la forme; nous en avons plus qu'assez déjà.Je ne pense pas que c'est mauvais pour poster du code portable. Peut-être que je pourrait annoter en tant que tel (si je suis conscient, comme je l'ai été avec open()), mais je crois qu'il faut donner aux gens les outils nécessaires pour écrire le code qui va toujours travailler pour eux et à qui ils le passent. Par exemple, Nifle de la réponse à l'aide de Fichier::Util peut fonctionner pour certains, mais ce module n'est pas sur ma machine par défaut. Et pour le Fichier le plus récent::Chemin d'accès de l'interface, j'ai dû trouver une construction plus récente Linux. Après quelques tests, il ressemble à la 3-arg open() fonctionne en remontant assez loin. Donc, vous avez au moins m'a convaincu de l'utiliser à l'avenir des exemples.
De vérifier la perldoc pour le Fichier::Path - vous pouvez passer d'un hachage comme deuxième argument, et l'ensemble {erreur => \my $err}. Alors $err sera une liste de hachage références, une paire clé/valeur pour chaque chemin d'accès qui a généré une erreur avec le message d'erreur.
OriginalL'auteur Michael Krebs