Thread Block vs. Hashref
(25 answers)
Opened by barney at 2024-08-02 13:17
Vor der "Lösung" aus dem Blog-Artikel möchte ich warnen:
Code (perl): (dl
)
my %hash = "here" => $_ for grep { -d $_ } qw{a b c .}; Der Autor feiert das als "kein Syntaxfehler" und "schneller", aber das ist absoluter Blödsinn, aus mehreren Gründen. Nach der Ausführung hat man das Äquivalent von: Code (perl): (dl
)
my %hash = ("here" => undef); Erstens ist es Unsinn, einen Hash aufzubauen, bei dem der Schlüssel immer den gleichen Wert hat, wie Rosti auch schon geschrieben hat. Aber zweitens ist die Präzedenz der Operatoren nicht so, wie der Autor vielleicht meint. Man muss da schon Klammern setzen: Code (perl): (dl
)
my %hash = ("here" => $_) for grep { -d $_ } qw{a b c .}; In %hash = "here" => $_ ist das Komma der Komma-Operator: Der linke Teil %hash = "here" wird ausgeführt, dann der Wert drangehängt, das nach der for-Schleife in $_ drin ist. Weil '.' als das aktuelle Verzeichnis ziemlich sicher den -d-Test besteht, ist das '.'. Das Ergebnis des Statements, das im Blog-Artikel verworfen wird, ist also die Liste ('here',undef,'.'). Code: (dl
)
1 $ perl -MData::Dumper -E 'print Dumper %hash = "here" => $_ for grep { -d $_ } qw{a b c .}' Mit dem Modul B::Deparse kann man sich die tatsächliche Klammerhierarchie auch zeigen lassen: Code: (dl
)
1 $ perl -MO=Deparse,-p -E '%hash = "here" => $_ for grep { -d $_ } qw{. a b c eg}' |