L'opérateur "goatse" ou l'idiome =()=
dans Perl provoque l'évaluation d'une expression dans un contexte de liste.L'Opérateur Secret de Perl Goatse est-il efficace?
Un exemple est:
my $str = "5 and 4 and a 3 and 2 1 BLAST OFF!!!";
my $count =()= $str =~ /\d/g; # 5 matches...
print "There are $count numbers in your countdown...\n\n";
Comme j'interprete l'utilisation, c'est ce qui se passe:
$str =~ /\d/g
correspond à tous les chiffres. Le commutateurg
et le contexte de liste produisent une liste de ces correspondances. Soit ceci l'exemple "List Producer", et en Perl cela pourrait être beaucoup de choses. Le=()=
provoque une affectation à une liste vide, de sorte que toutes les correspondances réelles sont copiées dans une liste vide.- L'affectation dans un contexte scalaire à $ count de la liste produite en 2. donne le nombre de la liste ou le résultat de 5.
- Le nombre de référence de la liste vide
=()=
va à zéro après l'affectation scalaire. La copie des éléments de la liste est ensuite supprimée par Perl.
Les questions sur l'efficacité sont les suivants:
- Ai-je tort que je suis ce Parsing?
- Si vous avez un producteur de liste et que tout ce qui vous intéresse est le nombre, y a-t-il un moyen plus efficace de le faire?
Cela fonctionne très bien avec cette liste triviale, mais si la liste était des centaines de milliers de correspondances? Avec cette méthode, vous produisez une copie complète de chaque match, puis vous le supprimez simplement pour les compter.
Il n'est pas aussi efficace que de concevoir une puce personnalisée pour implémenter votre programme. – jrockway
Pourquoi le vote à la baisse? N'est-ce pas une question juste sur le compromis entre l'efficacité et l'idiome? – dawg
Désolé, je n'ai pas pu résister à être l'auteur de la balise '' [goatse] '. : D – Ether