Je sais que tout sur l'historique des différents OSES ayant des formats de chemin différents, mais à ce stade de temps, il semble y avoir un accord général (avec une personne sans importance *) sur la façon dont les chemins fonctionnent. Je trouve l'ensemble de l'ensemble du fichier Cela vaut vraiment la peine d'avoir ce ensemble baroque de fonctions pour manipuler des chemins? S'il vous plaît convaincre moi que je suis à court de temps. P>
* non pertinent parce que même MS Windows permet de transférer des barres obliques dans les chemins, ce qui signifie que la seule chose funky est le volume au début et qui n'a jamais vraiment été un problème pour moi. P> :: spec code> itinéraire de la gestion des chemins pour être maladroit et une douleur inutile. P>
5 Réponses :
Deux principaux systèmes ont des volumes. Quel est le parent de c:? Dans UNIX, c'est Il existe trois groupes de séparateurs de chemins différents dans les principaux systèmes. Le fait que Windows prend en charge "/" pourrait simplifier les chemins de construction, mais cela n'aide pas à les analyser ou à les canoniser. P>
FILE :: SPEC fournit également des fonctions utiles qui le rendent utile même si chaque système utilise le même style de chemins, tels que celui qui transforme un chemin dans un chemin relatif. P>
Cela dit, je n'utilise jamais de fichier :: spec. J'utilise chemin :: Classe à la place. Sans sacrifier une convivialité ni une utilité, un chemin :: La classe fournit une bien meilleure interface. Et il ne permet pas aux utilisateurs de manuser les volumes. P> c: / .. code>. Dans Windows, c'est
C: .. code>. (Malheureusement, la plupart des gens font mal au dossier :: Spec du point de casser cela.) P>
Quel autre système majeur a des volumes?
@Chas. Owens, on dirait qu'il n'utilise pas "/" ou ".." (sauf en mode de compatibilité UNIX)
VMS est-il vraiment une plate-forme viable? Je pensais que Perl Soutien était davantage hors d'habitude et de gentillesse envers les rares personnes toujours coincées dessus. Si vous considérez VMS une plate-forme viable, alors Fichier :: SPEC CODE> ou un autre code de manutention du chemin est nécessaire car IIRC Il n'utilise pas
/ code> comme séparateur de chemin.
Je pensais que l'ensemble de la CWD-Per-Volume a fait une cohérence entre Windows et autre très impossible. Pouvez-vous développer oh ce que vous entendez par "Mishandle"?
@ysth, appelant splitdir code> sur un chemin au lieu de DIRS renvoyé par
splitpath code>
@Chas. Owens, Perl est activement maintenu pour VMS.
Oui absolument. p>
Golden règle de programmation, jamais du disque dur littéraux strings. Strike>
de
EDIT: L'un des meilleurs moyens d'éviter les problèmes de portage consiste à éviter les constantes spécifiques au système d'exploitation, en particulier sous la forme de littéraux en ligne. P>
I.E Strike> E.g Drive + ": /" + chemin + "/" + nom de fichier p>
C'est une mauvaise pratique mais Strike> Nous validons tous ces australiens à la hâte du moment ou parce que peu importe ce morceau de code. Fichier :: Spec est là pour quand un programmeur adhère à la programmation gospel. P>
En outre, il fournit les valeurs des répertoires système spéciaux et souvent utilisés par E.g TMP ou DevNull qui peut varier d'une distribution / un système d'exploitation à l'autre. P>
Si quelque chose qu'il pourrait probablement faire avec certains autres membres a été ajouté à celui-ci, comme l'utilisateur de pointer sur le répertoire Home des utilisateurs P>
Ce que vous revendiquez est la règle d'or de la programmation est complètement fausse. L'exemple (pour lequel "par" E.G "et non" I.e "est le latin correct) d'un littéral à chaîne codé durcée n'est même pas un littéral à chaîne. En fait, s'il s'agissait d'un littéral à chaîne codé, cela ne serait probablement pas buggy!
Exemple de code parfaitement bon avec deux littéraux à cordes codées: Ouvrir (My $ FH, '<', $ qfn) ou mourir ("Open: $!"); Code>
@ikegami Aucune chaîne n'est un exemple particulièrement bon d'une bonne chaîne codée. Vous voudrez peut-être changer '<' code> vers
'<: utf8' code> à un peu plus tard; De même, vous voudrez peut-être modifier les messages d'erreur (et doit utiliser
autoodie code> de toute façon). Cela dit, oui, je le fais aussi.
Merci d'avoir souligné les erreurs, ikegami. Il était tard la nuit et j'étais fatigué. J'ai révisé en conséquence.
Pour une gestion habituelle de fichier à l'intérieur de Perl, non, fichier :: SPEC n'est pas nécessaire et l'utilisation de SLAHES en avant par tout le monde fait beaucoup moins de douleur et fonctionne sur Win32 de toute façon. P>
cpanminus est un bon exemple utilisé par beaucoup de personnes et a été prouvé que le travail est excellent sur la plate-forme Win32. Il n'utilise pas de fichiers :: SPEC pour la plupart des manipulations de chemin de fichier et utilise simplement des barres obliques - qui l'ont même été suggérée par les développeurs expérimentés Perl-Win32. P>
Le seul endroit que je devais utiliser le fichier de fichiers :: Spec à CPANM, cependant, est l'endroit où je extraire des chemins de fichiers d'un message d'erreur Perl ( Entre-temps File :: Spec fournit des fonctions utiles telles que Canonical et Rel2abs - ce n'est pas "nécessaire" en soi mais vraiment utile. P> ne peut pas localiser le fichier \ path.pm bla bla code> ) et créer un chemin de fichier à passer à la ligne de commande (c.-à-d. cmd.exe). p>
Les esclaves en avant ne fonctionnent pas toujours sur Windows. J'ai beaucoup d'échecs de test où l'environnement a décidé de construire des chemins avec les backslashes, ce qui rend mes propres chemins avec des esclaves en avant n'étant pas les mêmes chaînes que je suis revenue de tout ce que j'utilisais. Avec File :: Spec, j'ai toujours eu tout ce que cet environnement ferait.
Droite, faire de vos propres chemins avec le transfert de barres obliques pourrait ne pas être la même avec vous êtes revenu de l'environnement - mais cela ne signifie pas que les barres obliques avant «ne fonctionnent pas». Les barres obliques avant fonctionnent, même avec combiné avec des backslashes à l'intérieur de votre code Perl. Il y a des exceptions comme je décrites dans le poteau, cependant.
MakePP (makpp.sourceforge.net) a une variable de maquillage $ / qui est / ou \ (sur la victoire non cygwin). La raison est que la victoire accepte / dans les noms de fichiers, mais pas dans les noms de commande (où il commence une option). P>
de http://perldoc.perl.org/file/spec.htmlled/a >: p>
CATDIR P>
Concaténate Deux noms de répertoires ou plus pour former un chemin complet se terminant par un répertoire. Mais retirez la barre oblique de fin de la chaîne résultante, car elle ne semble pas bonne, n'est pas nécessaire et confond OS / 2. Bien sûr, s'il s'agit du répertoire racine, ne coupez pas la barre oblique suivante: -) p>
blockQuote>
Alors, par exemple dans ce exemple je n'aurais pas besoin La regex pour supprimer la barre oblique si j'utilise
Catdir code>. P>