10
votes

Comment créer un chemin avec tous ses sous-répertoires dans un coup de feu dans Perl?

Si vous avez un chemin d'accès à un fichier (par exemple, /home/bob/test/foo.txt) où chaque sous-répertoire du chemin peut exister ou non, comment puis-je créer le fichier foo.txt d'une manière qui utilise "/home/bob/test/foo.txt" comme unique entrée au lieu de créer chaque répertoire inexistant dans le chemin d'un par un à un et de créer FOO.TXT elle-même?


0 commentaires

3 Réponses :


26
votes

Vous pouvez utiliser Fichier :: BasEname et fichier :: chemin xxx

Je n'ai ajouté aucun test pour voir si le fichier existe déjà mais c'est assez facile à ajouter avec perl.


5 commentaires

Je pense que vous voulez dire mkpath , pas make_path ? Sinon, bonne réponse.


@Hobbs: Consultez les docs pour Fichier :: chemin . mkpath est décrit comme "hérité" et la nouvelle interface utilise make_path pour cette fonction.


Ah, c'est un changement récent. La version que j'ai n'a pas cette interface. :)


Pour ajouter, selon Ce forum , make_path et supprimer_tree ne sont disponibles que depuis Fichier :: Chemin Version 2.07


Où avez-vous défini le paramètre $ fh ?



3
votes

0 commentaires

2
votes

Je ne pense pas qu'il y a une fonction standard pouvant faire tout ce que vous demandez, directement au nom de fichier.

mais mkpath (), du fichier de module :: chemin, peut presque le faire étant donné le répertoire du nom de fichier . Du fichier :: path docs:

La fonction "mkpath" fournit un moyen pratique de créer des répertoires, Même si votre appel «mkdir» appelez le noyau ne sera pas créer plus d'un niveau de Répertoire à la fois.

Notez que mkpath () ne signalent pas d'erreurs de manière agréable: elle meurt au lieu de simplement revenir à zéro, pour une raison quelconque.

donné tout cela, vous pourriez faire quelque chose comme suit: xxx


6 commentaires

Le code sous-jacent est d'environ deux décennies anciennes et la programmation Les modes ont beaucoup changé depuis. Vous utilisez l'ancien fichier de style :: interface de chemin. La nouvelle interface vous permet d'attraper toutes les erreurs et de les traiter (ou de les ignorer), le cas échéant.


Bon de savoir qu'il y a une nouvelle interface là-bas. J'ai l'habitude de devoir écrire Perl portable qui fonctionne pour les anciennes versions et sur les OSES (par conséquent, les deux-argers ouverts ()), donc je ne me taquine pas habituellement en apprenant ce qui est nouveau à Perl. :-)


@Michael: Je comprends que vous pourriez avoir besoin d'écrire de l'ancienne Perl pour des raisons, mais je ne comprends pas pourquoi vous posteriez un tel code comme des exemples pour d'autres. Si vous êtes au courant du formulaire de trois arguments de Ouvrir , veuillez l'utiliser ici. Nous n'avons pas besoin de plus d'exemples sur le filet du formulaire de deux arguments; Nous avons déjà assez que suffisant.


@Telemachus: Je ne pense pas que ce soit si mauvais de poster du code portable. Peut-être que je pourrais annoter en tant que tel (si je suis au courant, comme j'étais avec Open ()), mais je crois à donner aux gens les outils à écrire du code qui vont toujours travailler pour eux et qui leur transmettent toujours. Par exemple, la réponse de Nifle à l'aide du fichier :: Util peut fonctionner pour certains, mais ce module n'est pas sur ma machine par défaut. Et pour le nouveau fichier :: Interface de chemin J'ai dû trouver une boîte de linux plus récemment construite. Après quelques tests, on dirait que les œuvres 3-Arg Open () retournent assez loin. Donc, vous avez au moins convaincu que j'utilise cela dans les exemples futurs.


@ Michael-Krebs: Vérifiez le fichier Perldoc pour fichier :: chemin - vous pouvez transmettre un hachage comme deuxième argument et définir {error => \ My $ err}. Ensuite, $ ERR sera une liste des références de hachage, une paire de touches / valeur pour chaque chemin qui produisait une erreur avec le message d'erreur.


Merci @Michaelkrebs, je suis l'une de ces personnes utilisant un ancien système et l'option make_path n'a pas fonctionné. mkpath a fait cependant. Voici à vous 2016!