Thread ternary op und regexp (5 answers)
Opened by dukeofnukem at 2007-10-12 16:34

Taulmarill
 2007-10-12 17:01
#100762 #100762
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Wenn du das wirklich so schreiben willst, solltest du beide Zuweisungen Klammern, egal wie der regex aussieht. Grund ist, dass ?: stärker bindet als =
Dass die Zuweisung zwischen ? und : zusammen gehört, das kann sich perl noch denken, daher klammert der Precompiler das selbst (führe das Programm mal mit der Option -MO=Deparse aus). Dass die zweite Zuweisung auch zusammen gehört, ist aber nicht offensichtlich, daher passiert folgendes:
Code: (dl )
( /$Rx{'test'}/ ? ( $result = $1 ) : $result ) = ++$bogus;

Der tenäre Operator gibt ( $result = $1 ) zurück, und dem wird dann ++$bogus zugewiesen. Offensichtlicher wird das evtl., wenn du dir mal das Ergebnis von $foo in folgendem Programm anschaust:
Code: (dl )
1
2
my $foo = 0;
1 ? $foo = 2 : $foo += 3;

Man könnte auf die Idee kommen, $foo währe danach 2. Tatsächlich hat $foo aber den Wert 5.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B

View full thread ternary op und regexp