Voir la mise à jour ci-dessous forte> em> Je passe à travers tout un tas de scripts Perl que quelqu'un de mon entreprise a écrit. Il a utilisé au lieu de ceci: p> Ou même juste ceci: p> Il n'est plus ici, mais les gens qui me disent ici il a concaté des chaînes de cette manière parce que c'était en quelque sorte mieux em>. (Ils ne sont pas trop clairs pourquoi). P> Alors, pourquoi quelqu'un utiliserait-il J'essaie de nettoyer beaucoup de mess ici, et ma première pensée serait de mettre fin à cette pratique. Il rend le code plus difficile à lire, et je suis sûr que faire un J'ai de meilleures façons de le faire ici. P> Les gens sont confus. Il n'est pas juste pour les chemins de concaténation. Voici un autre exemple: P> rejoindre code> pour concaténer des chaînes. Par exemple, il le fait (pris à chaud d'un vrai script perl): p>
rejoindre code> dans cette affaire à l'aide de l'opérateur code> concaténate, ou simplement en tapant les cordes ensemble comme dans le troisième exemple? Y a-t-il une raison valable pour ce style de codage? P>
rejoindre code> n'est pas un moyen très efficace de concaténer des chaînes. Cependant, bien que j'ai écrit des scripts à Perl depuis la version 3.x, je ne me considère pas comme un gourou parce que je n'ai jamais eu la chance de traîner avec des gens qui étaient meilleurs que Perl que moi et que je ne pourrais m'apprendre Les secrets intérieurs profonds de Perl. Je veux juste m'assurer que mon instinct est correct ici avant que je me fasse un fou. P>
Mise à jour h3>
$hotfix = join("_", $app, $mod, $bld, $hf) . ".zip";
7 Réponses :
Toutes ces approches vont bien.
Join peut parfois être plus puissant que . Code> ConcaTenticate, en particulier lorsque certaines des choses que vous joignez sont des tableaux: P>
join "/", "~", @document_path_elements, $myDocument;
C'est la différence la plus importante entre Join et . Code>: JOINT prendra les arguments dans le contexte du tableau. Je doute que si tous les arguments sont des chaînes, la jointure est plus rapide que
. Code> cependant.
@Konerak: Perl n'a pas de "contexte de tableau", malgré sa fonction wanturray () code>. Il a Contexte de liste i>.
Merci - Sucks d'en savoir plus sur Perl en français, vous gâchez-vous sur des sites internationaux. MySQL est pire cependant, m'a pris 10 pages de lecture sur Déganches CODE> Avant de réaliser qu'ils parlaient de déclencheurs (après avoir vu le
Créer le déclencheur code> instruction;))
L'interpolation est un peu plus lente que de rejoindre une liste. Cela dit que je n'ai jamais su personne de le prendre à cet extrême. P>
Vous pouvez utiliser le module code> référence code> pour déterminer la quantité de différence là-bas. P>
En outre, vous pouvez poser cette question sur http://perlmonks.org/ . Il y a de vraies gourous là-bas qui peuvent probablement vous donner les secrets intérieurs beaucoup mieux que je ne le peux. P>
La performance est immatérielle ici. C'est la main-d'œuvre qui compte.
@Tchrist - Je suis vraiment d'accord. Il vient de demander pourquoi quelqu'un pourrait penser qu'il est préférable de le faire de cette façon. Je pense que cela a probablement à faire de la performance à une extrême :)
Fait intéressant sur les moines Perl, cela semble montrer que la concaténation est la plus rapide que rejoindre perlmonks.org/?node_id=654489
Je considérerais plus clair que les alternatives. Cependant, Fichier :: SPEC a été dans le noyau pendant une longue période. P> $hotfix = sprintf '%s_%s_%s_%s.zip', $app, $mod, $bld, $hf;
Si je crée un répertoire et des noms de fichier de manière indépendante de la machine, j'utiliserais Fichier :: Spec, mais ce n'était pas ma question. Ma question est pourquoi a-t-il concaté des chaînes de cette façon quand il aurait tout simplement pu le faire de deux autres manières. Ce n'était qu'un seul échantillon. Dans un autre, il l'a fait: rejoindre "", "$ app", "", "$ mod", " i>", $ bld, "_", "$ hf"; En d'autres termes, c'est la façon dont il concaténe des chaînes.
@David: rejoindre "" code> est inutile dans ce cas. Cependant, je considérerais
rejoindre '_', @List code> à trouver. En fin de compte, ce n'est pas une indépendance de la plate-forme que je me soucie. C'est la lisibilité. Et, à cet égard
Fichier :: Spec :: Catfile Code> et
Chemin :: Classe :: Fichier Code> Portez la journée. Je ne considère pas
"$ ceci / $ € / $ et / $ et / $ théothique" code> ou
$ ceci. "/". $ ça. "/". $ et. "/". $ There code> pour être lisible.
"$ ceci / $ $ cette / $ $ et / $ théothique" non lisible? Pour moi, c'est la forme la plus lisible parce que je n'ai pas à cartographier mentalement la chaîne. Utilisation de "Rejoindre" ou "Sprintf" signifie que je dois menacer mentalement la chaîne car les éléments de la commande ne sont pas dans l'ordre qu'ils seront dans la chaîne. Oui, ce n'est pas exactement une question de test de Mensa, mais cela prend encore quelques brefs millisecondes pour penser à la réponse. Le gotcha est lorsque vous avez des traits de soulignement qui confond l'interprète Perl.
En général, à moins que les listes d'articles soient jointes sont énormes, vous ne verrez pas une grande partie d'une différence de performance qui les modifie à des concaténations. La principale préoccupation est la lisibilité et la maintenabilité, et dans ces cas, si le formulaire d'interpolation de chaîne est plus clair, vous pouvez certainement l'utiliser. P>
Je devinerais que ceci est juste une préférence de codage personnel du programmeur d'origine. P>
En général, j'utilise rejoindre code> lorsque la longueur de la liste est grande / inconnue, ou si je suis jointe avec autre chose que la chaîne vide (ou un seul espace pour l'interpolation de la matrice). Sinon, en utilisant
. Code> ou une simple interpolation de chaîne est généralement plus court et plus facile à lire. P>
Perl compile des chaînes à double-citée dans des éléments avec qui peut vous inspirer des choses Comme ceci: p> comme dans: p> nifty, hein? p> p> P> rejoindre code> et
. code> caténation en eux:
Perl est tellement plus amusant que d'autres langues.
S'est amusé? En fait, vous montrez un très bon point: Perl est très efficace à la compilation. J'ai toujours soupçonné que l'idée qu'une seule façon soit plus efficace que l'autre est faux. Je suppose que cet expert ne connaissait pas vraiment Perl. Je remarque que ses noms variables sont partout. Certains sont tous des casquettes, certains ont des tirets, un étrange boîtier de chameau, etc. J'ai le sentiment qu'il a utilisé "Rejoindre" parce qu'il avait besoin d'une façon de concéder une chaîne et que les trucs standard comme des virgules ne fonctionnaient pas. Un geste rapide à travers la liste des fonctions Perl l'a amené à rejoindre.
J'ai fait ma belle part du développement commercial Perl pour "un détaillant en ligne bien connu", et je n'ai jamais vu Comme les autres ici, je ne vois aucune valeur authentique à l'aide de Comme cette question démontre, des idiomes de programmation ésotérique (dans n'importe quelle langue) conduisent à beaucoup de malentendus. Si vous avez de la chance, le malentendu est bénin. Les développeurs que j'aime travailler aux côtés sont ceux qui codent pour la lisibilité et la cohérence et laissent le Perl Golf pour le week-end. :) p>
En bref: Oui, je pense que son style unique s'apparente au style de conduite unique de votre fils. :) p> rejoindre code> utilisé comme ça. Votre troisième exemple serait mon alternative préférée, car c'est simple, propre et lisible. P>
Joindre code> en tant qu'enhangeur de performance. Cela pourrait bien performer marginalement mieux que l'interpolation des cordes, mais je ne peux pas imaginer une situation du monde réel où l'optimisation pourrait être justifiée mais le code toujours écrit dans une langue de script. P>
Je soupçonnai autant. Je ne pense pas qu'il connaisse vraiment Perl. Les choses comme des trindages sont dispersées et mal faites. Les noms variables ne suivent aucune convention. Je pense qu'il avait besoin de concessurer des cordes, en utilisant des virgules n'a pas fonctionné et il a donc lu une liste de fonctions de Perl et «rejoindre» semblait être ce que le médecin a commandé.
Tout en reconnaissant que, dans tous les exemples, je vois ici, il n'y a pas de différences de performance significatives, une série de concaténation, que ce soit avec J'ai un problème avec la critique que je vois nivelé ici; Il existe de nombreuses façons de bien parler de Perl, ce qui en fait certainement l'un d'eux. P>
indentation incohérente, d'autre part ... p> . code> ou avec une interpolation double quotidien, va effectivement être plus de mémoire -Enfait que une jointure, qui précompute le tampon de chaîne nécessaire pour le résultat au lieu de l'étendre plusieurs fois (même nécessairement de déplacer la résolution partielle vers un nouvel emplacement). P>
L'expansion des cordes simples (3ème exemple) a l'air bien envers moi. Je soupçonne que les personnes qui pensent que la 1ère version est mieux mieux sachée encore moins sur Perl que vous ou le développement que vous remplacez =)