programas herencia archivos perl syntax prototype

archivos - herencia en perl



¿Es esto un error con el prototipo glob de Perl? (2)

Sin ninguna razón en particular, estaba jugando con el prototipo glob (*) , y viendo lo que haría cuando el argumento es una subrutina definida.

Dado el siguiente código:

sub test (*) {print "[@_]/n"} sub blah ($) {"blah got @_"}

Si escribes test blah; obtienes el error de sintaxis Not enough arguments for main::blah...

Si escribe test blah 1; el programa compila e imprime [blah]

Si escribe la test blah die; el programa compila, imprime [blah] y NO muere.

Si escribe test blah(1); el programa compila e imprime [blah got 1]

Si escribe test blah(die); el programa se compila y luego muere.

Los últimos dos ejemplos son claramente una aplicación de la regla "si parece que una llamada de subrutina es una llamada de subrutina".

Sin embargo, los ejemplos sin paréntesis me parecen un error. Porque lo que parece estar sucediendo es que a pesar de estar en un contexto global, el analizador aún trata blah como una función de prototipo que requiere un argumento. Pero cuando se dice y se hace la compilación, el argumento para blah se descarta por completo, y la cadena ''blah'' se pasa a test .

Aquí hay un ejemplo de la test blah die; construir ejecutar a través de B::Deparse :

$ perl -MO=Deparse,-p -e ''sub test (*) {print "[@_]/n"} sub blah ($) {"blah got @_"} test blah die;'' sub test (*) { print("[@_]/n"); } sub blah ($) { "blah got @_"; } &test(''blah''); -e syntax OK

Entonces, como pueden ver, la die está completamente caída del árbol de operaciones.

Entonces mi pregunta es si otros consideran este comportamiento como un error. ¿El comportamiento está documentado en alguna parte? Si es un error, ¿vale la pena arreglarlo?


Esto se siente como un error, pero ¿qué esperabas que sucediera?

Después de haber jugado un poco más Perl parece estar usando algún tipo de inteligencia deformada.

test blah 1 2

falla porque 2 se ve como una irrelevancia.

Entonces, ''blah 1'' pasa una comprobación para una función con 1 parámetro, pero luego el manejo global no recoge esto. Usar un prototipo escalar hace lo que estás esperando.

sub test (*) {print "[@_]/n"} ==> blah got 1

También verifiqué si había quizás más parámetros ...

sub test(*) { print "[$_[0] $_[1]]/n" }

bombas como $ _ [1] no existe.


Los prototipos en Perl son malas noticias . Están terriblemente rotos. En realidad, funcionan perfectamente, pero nuestros meros cerebros mortales no pueden contemplar la profundidad total de los prototipos de Perl.

Se supone que deben permitirle llamar a una función definida por el usuario como si fuera una función incorporada, pero la forma en que funcionan es extremadamente confusa. Vea Perldoc persub para saber cómo funcionan (y no funcionan).

Ha habido un movimiento por un tiempo para eliminar los paréntesis de las llamadas a la función Perl, y supongo que, en algunas circunstancias, eliminar paréntesis superfluos puede hacer que el código sea un poco más fácil de leer. Sin embargo, esta pequeña mejora no es lo suficientemente grande como para superar las trampas de la creación de prototipos.

Definitivamente estás mirando los límites de la creación de prototipos. De hecho, su código es realmente bastante confuso y agregar paréntesis mejoraría su legibilidad. Sí, sé que ese no es tu propósito. Tu objetivo es contemplar el prototipado de Perl hasta que te conviertas en uno con Larry Wall. Aprecio tu valor. Experimenté con la creación de prototipos hasta que corrí llorando a mi habitación, di un portazo y me negué a salir hasta la hora de la cena. Pasaron años de psicoterapia y consumo excesivo de alcohol para superar mi experiencia con la creación de prototipos de Perl. Incluso hoy, lloraré incontrolablemente cada vez que veo /@@ .

Se supone que Perl 6 hará que todo sea mejor. Desafortunadamente, Perl 6 ha estado trabajando durante más tiempo que Duke Nukem Forever .

Ligera exageración Duke Nukem se anunció en 1997, mientras que Perl 6 se anunció en 2000, por lo que Duke Nukem tiene alrededor de tres años en Perl 6. Pero entonces, Duke Nukem tiene una fecha de lanzamiento (junio de 2011) que es más que Perl 6.

De acuerdo, suficiente queja. Probablemente sea mejor que busque ayuda en el sitio de Perlmonks . Ahí es donde los gurús Perl pasan el rato. Probablemente puedan explicar todo lo que sucede con su programa y por qué está haciendo exactamente lo correcto.

David Weintraub

perl -e ''print "Simplemente otro hacker Perl de segunda tasa / n";''

APÉNDICE

Parece mucho más que todo lo que siempre quisiste saber sobre los prototipos en Perl ha sido transferido a Perl Monks . Ese es el artículo que explicará por qué sus prototipos se están comportando como se esperaba .