¿Cuál es la diferencia en la evaluación retardada del código en las subrutinas de Perl de 5.8 vs 5.10 y 5.12?

StackOverflow https://stackoverflow.com/questions/2768167

  •  03-10-2019
  •  | 
  •  

Pregunta

Este bit de código se comporta de manera diferente bajo Perl 5.8 que lo hace bajo Perl 5.12:

my $badcode = sub { 1 / 0 };
print "Made it past the bad code.\n";

Cuando corro bajo 5.8, me sale un error a pesar de que nunca se ejecuto la división:

[brock@chase tmp]$ /usr/bin/perl -v  

This is perl, v5.8.8 built for i486-linux-gnu-thread-multi

[brock@chase tmp]$ /usr/bin/perl badcode.pl  
Illegal division by zero at badcode.pl line 1.

[brock@chase tmp]$ /usr/local/bin/perl -v  

This is perl 5, version 12, subversion 0 (v5.12.0) built for i686-linux  

[brock@chase tmp]$ /usr/local/bin/perl badcode.pl  
Made it past the bad code.

En perl 5.10.1, se comporta como lo hace bajo 5.12:

brock@laptop:/var/tmp$ perl -v

This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi

brock@laptop:/var/tmp$ perl badcode.pl  
Made it past the bad code.

obtener los mismos resultados con una subrutina llamada, por ejemplo.

sub badcode { 1 / 0 }

No veo nada de esto en la vaina perl5100delta. Es este un cambio no documentado? Un efecto secundario no deseado de algún otro cambio? (Para el registro, creo que 5.10 y 5.12 están haciendo lo correcto.)

¿Fue útil?

Solución

Creo que esto fue planeado, y lo hago ver esto mencionado en perl5100delta.pod :

Excepciones en el plegamiento constante

La rutina de plegado constante es ahora envuelto en un controlador de excepciones, y si plegado produce una excepción (tales como se trata de evaluar 0/0), Perl ahora conserva la optree actual, en lugar que abortar todo el programa. Sin este cambio, programas guardarían No compilar si tenían expresiones que pasó a generar excepciones, a pesar de que esas expresiones se encontraban en código que nunca podría ser alcanzado en tiempo de ejecución. (Nicholas Clark, Dave Mitchell)

Sólo tiene que ver con lo dividido por cero excepción no resulta en una cancelación de la compilación de etapa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top