El "operador de cabras" o la expresión =()=
en Perl hace que una expresión se evalúe en el contexto de la lista.¿Es eficiente el "operador secreto" de Perl Goatse?
Un ejemplo es:
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";
Mientras interprete el uso, esto es lo que sucede:
$str =~ /\d/g
coincide con todos los dígitos. El contexto de cambio y listag
produce una lista de esas coincidencias. Deje que este sea el ejemplo de "List Producer", y en Perl esto podría ser muchas cosas.=()=
causa una asignación a una lista vacía, por lo que todas las coincidencias reales se copian en una lista vacía.- La asignación en contexto escalar a $ recuento de la lista producida en 2. da cuenta de la lista o el resultado de 5.
- El cómputo de referencia de la lista vacía
=()=
tiende a cero después de la asignación escalar. La copia de los elementos de la lista es eliminada por Perl.
Las preguntas sobre la eficiencia son los siguientes:
- Estoy equivocado en la forma en que estoy de análisis de esto?
- Si tiene algún Productor de listas y todo lo que le interesa es el recuento, ¿hay alguna forma más eficiente de hacerlo?
Funciona muy bien con esta lista trivial, pero ¿y si la lista fuera cientos de miles de coincidencias? Con este método, estás produciendo una copia completa de cada partida y luego eliminándola solo para contarlas.
No es tan eficiente como diseñar un microchip personalizado para implementar su programa. – jrockway
¿Por qué votar abajo? ¿No es esta una cuestión justa sobre la compensación entre eficiencia y modismo? – dawg
Lo siento, no pude resistirme a ser el creador de la etiqueta para '[goatse]'. : D – Ether