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

torsten
 2011-09-23 16:21
#152640 #152640
User since
2010-08-16
45 Artikel
BenutzerIn
[Homepage] [default_avatar]
2011-09-23T12:40:19 pq
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


Du machst hier den von GwenDragon geschilderten Fehler und prüfst das Resultat von =~ nicht.

Ich habe Dein Beispiel etwas abgewandelt:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ perl -le '
my @array = ("foo bar baz", "FOO BAR BA?", "a b c", "d e f");
for(1..4) {
  for my $i (0..$#array) {
    if( $array[$i] =~ m/(\w{3})/g ) {
      print "$i: $1";
    } else {
      print "$i: no match";
    }
  }
}'
0: foo
1: FOO
2: no match
3: no match
0: bar
1: BAR
2: no match
3: no match
0: baz
1: no match
2: no match
3: no match
0: no match
1: FOO
2: no match
3: no match


Der g Modifier merkt sich für jeden String die Position des letzten Matches und fängt beim nächsten Mal dort an. Ein fehlgeschlagener Match setzt diese Position zurück. Das sieht man sehr schön beim zweiten String in den Zeilen 21 und 25. In Zeile 21 sieht der Match den String  BA?, der nicht auf \w{3} passt. Also wird pos zurückgesetzt. Beim nächsten Match in Zeile 25 wird also wieder von Anfang begonnen und er findet FOO.

View full thread Array, Match und $1