8
votes

SIGIL SYNTAX PERL

Puis-je savoir quelle est l'utilisation du et devant les sous-marins, sans cela, les sous-verbaux sont toujours en mesure d'exécuter.

et aussi, le mon devant les variables de Perl.

Je sais que c'est pour la syntaxe de langues stricte ou ce que ne pas, mais pourquoi ne pas simplement en faire un standard que chaque variable doit être déclarée par un mon

Modifier

Merci pour toutes vos discussions / réponses, je souhaite accepter beaucoup de vos réponses, mais que je ne peux qu'accepter un seul, j'accepterai celui où d'autres utilisateurs peuvent comprendre avec facilité.


1 commentaires

Pour les futurs lecteurs: la réponse de Eric Strom est la seule qui est complètement correcte. Le comportement du prototype de vaincre & est important à savoir.


5 Réponses :


8
votes

Le mon limite la variable à la portée actuelle. Avec le Utiliser strict pragma, que vous devez utiliser, vous devez déclarer les variables (par exemple avec mon ). L'alternative à aller sans exister pour des raisons de flexibilité de scripts très courts.

Le et est rarement utilisé depuis que Perl par défaut, interprète des mots sans sigil, mais est utile si vous souhaitez créer des sous-programmes, mais est utile si vous souhaitez créer une référence au sous-programme. xxx


1 commentaires

Réponse simple et directe .. Merci d'avoir clarifié =)



5
votes

Puis-je savoir quelle est l'utilisation de la & devant les sous-marins, sans cela, les sous-verbaux sont toujours en mesure de courir.

Compatibilité à l'envers avec Perl 4

Et aussi, le mon devant des variables Perl.

Il définit la portée du bloc

Je sais que c'est pour la syntaxe de langues stricte ou ce qui n'est pas, mais pourquoi ne font-ils pas simplement en faire un standard que chaque variable doit être déclarée par a?

  1. Compatibilité à l'envers (donc Utiliser strict; interdire des déclarations variables nues)
  2. variables peut également être déclarée avec Notre ou local

1 commentaires

En outre, il est plus facile d'écrire 1 doublures avec perl -e sans mon .



0
votes

& a encore une bonne distinction: appeler avec elle ( & yysub ) rend actuellement @_ visible pour appelé sous aussi. Quoi qu'il en soit, je l'utilise dans mes scripts principalement pour des raisons de clarté: cela indique clairement, qui sont mes propres fonctions et qui fonctionne de noyau ou de modules.

sur mon . Chaque didacticiel et chaque DOC suggère d'utiliser utiliser strict; pragma, vous devez donc déclarer votre variable avec mon . Donc, la situation de mon point de vue est jolie à l'envers: si la portée est si importante pour les meilleures pratiques, il serait normal que les variables soient scopées par défaut (comme nous disons avec mon maintenant) et quand nous Vraiment besoin de variables globales, nous devrions les déclarer comme ça. Je comprends que c'est l'héritage de Perl, mais c'est toujours contre l'idéologie de Perl pour empêcher la redondance. En utilisant mon à chaque fois pour déclarer pourrait être remplacé par une sorte de pragma. [Désolé, Robobooga, peut-être aller trop loin de votre question]


3 commentaires

Malheureusement, si, dire, Perl 5.14 permettrait à strict par défaut, alors tout le code PERL existant qui ne pas utilise strict est instantanément cassé. Perl 5.12 va un peu dans cette direction: Si vous Utilisez 5.012 , alors strict est activé automatiquement.


@mscha: Oui, je comprends, il n'ya aucun moyen de faire défaut de pragma strict pour chaque script écrit là-bas, mais je rêve de pragma, où toutes les variables sont par défaut locales dans leur portée et quand j'ai besoin de variables globales, je déclare les explicitement avec notre


Cela ne vous dérange pas d'utiliser mon si souvent. Lorsque j'ai une variable dans la portée la plus externe et déclarez également une fonction avec une variable du même nom (pour la clarté, à sa manière), je sais que je reçois une nouvelle variable dans le SUB, car je dois maintenant penser que non utiliser mon plutôt que de penser à l'utiliser.




12
votes

dans Perl, les appels de fonctions ont été optimisés pour ne pas nécessiter le sigil & code>. Lorsque vous déclarez un sous-programme:

use strict;


our $foo = 5;  # $main::foo == $foo


{ # scope start
   my $foo = 6;

   print "$foo, $main::foo\n"; # prints '6, 5';
} # scope end

print "$foo, $main::foo\n";  # prints '5, 5' 
                             # since $foo and $main::foo are the same


4 commentaires

Merci pour votre réponse et vos explications très complètes


@Eric Strom: Vous dites que les & ne devraient généralement pas être utilisés. Cependant, j'ai remarqué que Emacs fait une belle syntaxe de syntaxe si vous utilisez et sous les appels de sous-programme. Y a-t-il un inconvénient ou un danger spécifique pour les utiliser à cet effet? Ou, de préférence, existe-t-il un moyen d'obtenir des emacs à la syntaxe Mettez-vous des sous-marins sans elle?


@Ygomez => Le danger avec l'utilisation de & Tout le temps est que & mysub et & mysub () font des choses très différentes (les anciens appels Avec la valeur actuelle de @_ , et celle-ci appelant le sous avec une liste d'arguments vide). Étant donné que les deux noms sont si visuellement similaires, il peut être facile de se tromper un pour l'autre, ce qui entraînera du mal à diagnostiquer des bugs. Étant donné que Perl ne nécessite pas le et dans la plupart des endroits, il est donc préférable de le laisser dehors et ne l'utilise que lorsque vous souhaitez explicitement le comportement qu'il peut fournir. En ce qui concerne Emacs, je suis sûr qu'il y a d'autres modes de surbrillance de la syntaxe.


Il convient également de noter que & foo; est différent dans l'exécution à FOO (@_); - le premier ressemble plus à un goto, laissant la pile en place qui, dans Des cas rares et très spécifiques tels que la récursion de la queue profonde peuvent être une grosse victoire de performance.