perl autovivification

Pregunta de vivificación de Perl mientras se elimina la referencia a una matriz indefinida.



autovivification (3)

Las divergencias se autovivifican en el contexto de valor (lo que significa cuando se espera un valor modificable), y foreach crean un contexto de valor.

>perl -E"$$x = 1; say $x;" SCALAR(0x74b024) >perl -E"++$$x; say $x;" SCALAR(0x2eb024) >perl -E"/$$x; say $x;" SCALAR(0x30b024) >perl -E"sub {}->($$x); say $x;" SCALAR(0x27b03c) >perl -E"for ($$x) {} say $x;" SCALAR(0x25b03c)

Los dos últimos crean un contexto lvalue porque necesitan un valor al que alias $_[0] y $_ (respectivamente).

Me cuesta entender por qué funciona lo siguiente:

my $array_reference; foreach $element (@{$array_reference}) { # some code }

mientras que lo siguiente no funciona

my $array_reference; if (scalar (@{$array_reference}) { # some code here }

Entiendo que Perl da vida (auto vivifica) referencia indefinida. Pero todavía estoy confundido como en por qué este último segmento de código arroja FATAL.


Perl tiene inconsistencias en esta área, pero en general, el código que puede modificar una estructura se autovivica, mientras que el código que no lo hace no lo hace. Y si no se autivivifica, está intentando eliminar la referencia de un valor indefinido, lo que desencadena una advertencia o, bajo el use strict "refs" , una excepción.


Pienso, mirando a perlref , que este es el comportamiento esperado:

"Las referencias del tipo apropiado pueden surgir si se las elimina en un contexto que asume que existen " .

Algo similar a foreach sucede con push () y amigos:

my $f; push @$f, 1; say @$f;

Aunque no con las nuevas versiones, can-just-take-a-reference:

my $f = []; push $f, 1; say @$f;

trabaja, mientras

my $f; push $f, 1; say @$f;

no, lo cual creo que es sensato, ya que empujar no tiene idea de lo que realmente quisiste decir allí.

La pregunta interesante es si el escalar (@ $ undef) hace lo mismo, o debería advertir, ya que eventualmente devuelve undef, creo que debería advertirlo de inmediato.