Schrift
[thread]10567[/thread]

ternary op und regexp

Tags: Ähnliche Threads

Leser: 1


<< >> 6 Einträge, 1 Seite
dukeofnukem
 2007-10-12 16:34
#100759 #100759
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
Alohá!

Wenn ich so was mache:


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my $bogus;
my $result;

my $Rx = ( test => qr/abc(\d+)def/s );

my @cont = do{ local( *ARGV, $/, $_ ); @ARGV = $file; $/ = "arglbargl"; <>; };

for ( @cont ) {

/$Rx{'test'}/ ?
$result = $1 :
$result = ++$bogus;

print $result;
}


kriege ich trotz greifender Rx $result = ++$bogus zurück, wenn ich allerdings

/$Rx{'test'}/ ?
( $result = $1 ) :
( $result ) = ++$bogus;



benutze ist alles wunderbar, auch

$result = /$Rx{'test'}/ ?
$1 : ++$bogus;


klappt wunderbar ~:-/

Wieso muß die Zuweisung in Klammern? Wenn die Regexp nicht interpoliert werden muß, klappts auch so:

/abc(\d+)def/ ?
$result = $1 :
$result = ++$bogus;


...

entnervt,

Martin

edit pq: code-tags hinzugefügt
drum&bass is a state of mind
Taulmarill
 2007-10-12 16:43
#100760 #100760
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich glaub du hast ? : noch nicht ganz verstanden. versuche mal:
Code: (dl )
$result = /$Rx{'test'}/ ? $1 : ++$bogus;


edit: mir ist noch aufgefallen, dass du den regex unter dem key testrx ablegst, aber mit dem key test darauf zuzugreifen versuchst.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
dukeofnukem
 2007-10-12 16:45
#100761 #100761
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
dukeofnukem+2007-10-12 14:34:06--
auch

$result = /$Rx{'test'}/ ?
$1 : ++$bogus;

klappt wunderbar ~:-/


Japp, scho klar, thx. Aber wieso klappt die erste Variante nicht wenn die Regexp interpoliert werden muß und funktioniert wenn die Rexexp direkt zur Verfügung steht?

Martin

P.S.: Hab die rexexp in test umbenannt, thx
drum&bass is a state of mind
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
Linuxer
 2007-10-12 17:04
#100763 #100763
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Code: (dl )
my $Rx = ( test => qr/abc(\d+)def/s );


Was soll das tun? Einen Hash an einen Skalar zuweisen?
Ich denke, dass Du hier was anderes erwartest, als Du bekommst.
Schau Dir mal direkt nach der Zuweisung an, was im Skalar $Rx steht.

Mir scheint, dass Du kein "use strict;" und kein "use warnings;" verwendest. Das sei Dir dringendst angeraten.

Entweder
Code: (dl )
1
2
my %Rx = ( test => qr// );
print $Rx{test}, $/;

oder
Code: (dl )
1
2
my $Rx = { test => qr// };
print $Rx->{test}, $/;

meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
dukeofnukem
 2007-10-12 17:29
#100765 #100765
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
Danke für die Antworten, habs jetzt kapiert :-)

@linuxer: Sorry, klar sollte das ne Hash-Deklaration sein, also %Rx = (...)
drum&bass is a state of mind
<< >> 6 Einträge, 1 Seite



View all threads created 2007-10-12 16:34.