Thread Array, Match und $1 (14 answers)
Opened by IceRage at 2011-09-22 22:54

pq
 2011-09-23 14:40
#152634 #152634
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
also gut, hier eine demo:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
$ perl -wE'
my @array = ("foo bar baz", "FOO BAR BAZ","a b c","d e f");
for my $i (0..$#array) {
$array[$i] =~ m/(\w{3})/g;
say $1;
}'
foo
FOO
FOO
FOO


hier mit einer extra my() variable:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
$ perl -wE'
my @array = ("foo bar baz", "FOO BAR BAZ","a b c","d e f");
for my $i (0..$#array) {
my $string = $array[$i];
$string =~ m/(\w{3})/g;
say $1;
}'
foo
FOO
a b
d e


ich kann die feinheiten der beiden leider auch nicht erklären (*), aber es ist auf jeden fall ein resultat des globalen matchings.

die ergebnisse "a b" und "d e" im zweiten beispiel erklären sich übrigens so, dass $1 nicht neu gesetzt wird, sondern noch vom alten matching da ist, aber nun leider in $string eine neue variable steht. $1 ist nämlich kein einfacher string, sondern merkt sich den offset und die länge des matches.

also nochmal, globales matching in skalarem kontext will man meist nur in einer while-schleife, also bis der string abgearbeitet ist.

edit: (*) der unterschied ist, dass in beiden fällen in schleife 3 und 4 $1 nicht neu gesetzt wird, aber im zweiten beispiel wegen des my() auf die neue variable angewendet wird.

edit2: wenn du beim 2. beispiel das /g weglässt, bekommst du dasselbe ergebnis wie in beispiel 1.


fazit: 1. immer erst den erfolg des matchings abfragen und nur dann $1 verwenden. 2. globales matching im skalaren kontext ist in den meisten fällen nicht gewollt.
Last edited: 2011-09-23 15:03:35 +0200 (CEST)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread Array, Match und $1