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? P>
3 Réponses :
Vous pouvez utiliser Fichier :: BasEname et fichier :: chemin Je n'ai ajouté aucun test pour voir si le fichier existe déjà mais c'est assez facile à ajouter avec perl. p> p>
Je pense que vous voulez dire mkpath code>, pas make_path code>? Sinon, bonne réponse.
@Hobbs: Consultez les docs pour Fichier :: chemin code>. mkpath code> est décrit comme "hérité" et la nouvelle interface utilise make_path code> 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 code> et supprimer_tree code> ne sont disponibles que depuis Fichier :: Chemin Version 2.07 Code>
Où avez-vous défini le paramètre $ fh code>?
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: p>
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. P> blockQuote>
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. P>
donné tout cela, vous pourriez faire quelque chose comme suit: p>
xxx pré> p>
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 code>, 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!