Thread s/// in map? - Arrayzuweisung kürzer schreiben (12 answers)
Opened by Sven_123 at 2011-03-08 10:31

clms
 2011-03-08 12:39
#146309 #146309
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
2011-03-08T11:02:57 Sven_123
Kann mir wer folgendes Ergebnis erklären?
Code (perl): (dl )
1
2
my $eins = {"indirekt.txt" =~ /(.+)\.txt/ => "value"};
my %zwei; $zwei{"direkt.txt" =~ /(.+)\.txt/} = "value";

Bei der ersten Methode wird also $1 als key benutzt, bei der zweiten nur eine 1 als true. Gibt es da eine Logik dahinter, oder nicht?
Ja. gibt es.

Im ersten Fall wird "indirekt.txt" =~ /(.+)\.txt/ im List-Kontext ausgewertet. Da gibt es die Liste der gematchten Gruppen zurück (also ($1,$2...) oder values %+, genaues müsste ich jetzt auch nachschlagen). Hier ist es auf jeden Fall ("indirekt").

Im zweiten Fall wird es im Scalar-Kontext ausgefühtr. Da gibt es die Anzahl der erfolgreichen Matches zurück. Die ist hier 1.

Edit: Nachtrag
Wenn man im zweiten Fall List-Kontext herstellt wird "direkt" als Key verwendet:
Code (perl): (dl )
$zwei{(),"direkt.txt" =~ /(.+)\.txt/} = ...


BTW: Gibt es eigentlich eine elegantere Möglichkeit, den Match in List-Kontext zu setzen, als das (),?
Last edited: 2011-03-08 12:51:45 +0100 (CET)

View full thread s/// in map? - Arrayzuweisung kürzer schreiben