Apparemment, ma compréhension du pragma no autovivification est imparfaite, car le comportement non-mourir-en-ligne-19 du script suivant est extrêmement surprenant pour moi.Autovivification inattendue des arguments
use 5.014;
use strict;
use warnings;
no autovivification qw(fetch exists delete warn);
{
my $foo = undef;
my $thing = $foo->{bar};
# this does not die, as expected
die if defined $foo;
}
{
my $foo = undef;
do_nothing($foo->{bar});
# I would expect this to die, but it doesn't
die unless defined $foo;
}
sub do_nothing {
return undef;
}
Exécution du script produit:
Reference was vivified at test.pl line 8.
La question: pourquoi est $foo
autovivified lorsque $foo->{bar}
est fourni comme argument à un sous, même si no autovivification
est en vigueur?
Avez-vous l'installer? Peut-être ajouter 'warn' à la liste des unimports. Ce serait 'pas d'autovivification qw;' et voyez s'il y a un avertissement quand il est évité comme le disent les docs. –
simbabque
Il est installé, sinon le script va mourir à la ligne 11. J'ai mis à jour la question avec les résultats de l'ajout de 'warn'. – ryanm
Ce n'est pas si surprenant. Perl ne sait pas vraiment que 'do_nothing' ne fait rien, et puisque vous lui avez donné un argument, il doit l'autovivifier pour que vous puissiez l'utiliser dans le sub. En particulier, il ne sait pas si vous faites une affectation à '$ _ [0]' ou pas dans 'do_nothing'. – Dada