Warum erfolgt die Autovivifizierung mit keys () und nicht mit% {..}?

8

Das ist eine Feinheit, die ich mit keys() gefunden habe.

%Vor%

Ich bin höchst verwundert darüber, warum das erste Snippet keinen Dereferenzierungsfehler ergeben würde. Wenn ich Data::Dumper verwende, wird klar, dass im ersten Ausschnitt $d->{cd} autoviviert wird, um {} zu sein.

Warum muss keys autovivifizieren? Ich habe versucht, die perldoc dafür zu lesen, konnte keine befriedigende Antwort finden. keys legt keinen Alias ​​fest ( $_ , etc), also muss Perl nicht denken, dass $d->{cd} im Lvalue-Kontext sein muss, oder? (Ich verstehe, wenn der Ausdruck in lvalue Kontext Autovivification sein muss passiert wie hier .

Ein relevanter Beitrag .

    
eric_rookie1 27.01.2016, 04:45
quelle

2 Antworten

3

Beachten Sie, dass Schlüssel in der Tat ein lvalue sein können (indem Sie die erwartete Anzahl von Elementen für den Hash festlegen).

Aber selbst wenn Schlüssel selbst nicht in einem Lvalue-Kontext verwendet werden, hat dies den Nebeneffekt, dass der Iterator eines Hashes zurückgesetzt wird.

Es ändert also den Hash und gibt der Dereferenz einen Lvalue-Kontext, der sie autovivifizieren lässt.

    
ysth 27.01.2016 07:30
quelle
0

Nach einigen Nachforschungen und Nachfragen habe ich festgestellt, dass dies mit der Tatsache zu tun hat, dass $d->{cd} an eine Subroutine übergeben wurde, nicht die Tatsache, dass es keys war. Zum Beispiel,

%Vor%

Dies wird auch autovivify; Dies liegt daran, dass intern perl in der Lage sein muss, einen Alias ​​für Funktionsargumente zu setzen.

Innerhalb von foo() haben wir einen Alias-Satz $_[0] = $d->{cd} Aber das bedeutet $d->{cd} muss lvalwertfähig sein, da Unterprogramme in Perl davon ausgehen, dass Sie etwas wie $_[0] = "123"; tun können, damit die Autovivifikation erfolgen muss.

    
eric_rookie1 27.01.2016 18:21
quelle