Questa è una sottigliezza che ho trovato con keys()
.Perché l'autovivificazione si verifica con le chiavi() e non con% {..}?
$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my @e = keys(%{$d->{cd}});'
$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my %e = %{$d->{cd}};'
Can't use an undefined value as a HASH reference at -e line 1.
Sono molto perplesso sul motivo per cui il primo frammento di non darebbe un errore dereferencing. Quando uso Data::Dumper
, diventa chiaro che nel primo frammento, $d->{cd}
, viene autovivificato per essere {}
.
Perché è necessario automatizzare lo keys
? Ho provato a leggere il perldoc
per questo, non ho trovato una risposta soddisfacente. keys
non imposta un alias ($_
, ecc.) Quindi perl non è necessario pensare che $d->{cd}
debba essere nel contesto di lvalue, c'è? (Ho capito se l'espressione deve essere in lvalue contesto autovivificazione accade come spiegato here.
Un rilevante post.
https://rt.perl.org/Public/Bug/Display.html?id=118983 – ThisSuitIsBlackNot