Wie undef $1 hinkriegen?

05/03/2011 - 18:29 von Peter Velan | Report spam
Hallo

ich habe das hier ...

The numbered match variables ($1, $2, $3, etc.) and the related
punctuation set ($+ , $& , $` , $' , and $^N ) are all dynamically
scoped until the end of the enclosing block or until the next
successful match, whichever comes first.

... in "perlre" gelesen und darum bin ich auch nicht überrascht,
dass das hier ...

-
#!/usr/bin/perl -w -s

my $text = 'vara 123 varb 456 ';
$text =~ m/vara (\d+) /; my $vara = $1 ? $1 : 'nixa'; # check 1
$text =~ m/varb (\d+) /; my $varb = $1 ? $1 : 'nixb'; # check 2

print "text=\"$text\"";
print "vara=\"$vara\"";
print "varb=\"$varb\"";

$text = 'vara 123 varc 456 ';
$text =~ m/vara (\d+) /; $vara = $1 ? $1 : 'nixa'; # check 1
$text =~ m/varb (\d+) /; $varb = $1 ? $1 : 'nixb'; # check 2

print "text=\"$text\"";
print "vara=\"$vara\"";
print "varb=\"$varb\"";

exit;
-

... das hier ...

-
text="vara 123 varb 456 "
vara="123"
varb="456"
text="vara 123 varc 456 "
vara="123"
varb="123"
-

... liefert.

Was kann ich tun, damit nach misslungenem "check 2" NICHT der Wert
des letzten "successful match" geliefert wird? Erwünscht ist ...

-
text="vara 123 varc 456 "
vara="123"
varb="nixb"
-

Das hier ...

-
undef $1;
$1 = '';
-

geht nicht, auch klar.

Danke für Tipps,
Peter
 

Lesen sie die antworten

#1 Ralf Döblitz
05/03/2011 - 20:38 | Warnen spam
Peter Velan schrieb:
Hallo

ich habe das hier ...

The numbered match variables ($1, $2, $3, etc.) and the related
punctuation set ($+ , $& , $` , $' , and $^N ) are all dynamically
scoped until the end of the enclosing block or until the next


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
successful match, whichever comes first.


[...]
Was kann ich tun, damit nach misslungenem "check 2" NICHT der Wert
des letzten "successful match" geliefert wird? Erwünscht ist ...

-
text="vara 123 varc 456 "
vara="123"
varb="nixb"
-



Wie oben steht: scope bis zum Ende des Blocks, also einfach die
Anweisungen in einen Block packen:

- cut here -
#!/usr/bin/perl -w -s

my $text = 'vara 123 varb 456 ';
my ($vara, $varb);
{$text =~ m/vara (\d+) /; $vara = $1 ? $1 : 'nixa';} # check 1
{$text =~ m/varb (\d+) /; $varb = $1 ? $1 : 'nixb';} # check 2

print "text=\"$text\"";
print "vara=\"$vara\"";
print "varb=\"$varb\"";

$text = 'vara 123 varc 456 ';
{$text =~ m/vara (\d+) /; $vara = $1 ? $1 : 'nixa';} # check 1
{$text =~ m/varb (\d+) /; $varb = $1 ? $1 : 'nixb';} # check 2

print "text=\"$text\"";
print "vara=\"$vara\"";
print "varb=\"$varb\"";

exit;
- cut here -

Damit bekommst du dann auch dies:

text="vara 123 varb 456 "
vara="123"
varb="456"
text="vara 123 varc 456 "
vara="123"
varb="nixb"

Ralf
Wenn Du so minderbemittelt bist, daß Du es nötig hast, die Worte anderer
für Dich sprechen zu lassen, dann kann ich Dir meine Hilfe schlecht
versagen...
  – Thorsten Albers in

Ähnliche fragen