Schrift
[thread]8734[/thread]

m//g in list context: filling an array with matches



<< >> 3 Einträge, 1 Seite
dukeofnukem
 2007-02-07 13:42
#74118 #74118
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
Alohá!

Habe folgendes Problem:

In einem String der eine geslurpte Datei enthält befindet sich eine Zeile

Stepnames=X_yz_a, WX_qr, agbsar_asd, asdefe, ABC_XYZ

Nun würde ich gern @orgsteps damit füllen. Durch

Code: (dl )
my @orgsteps = $ref =~ /^Stepnames=(?:(\w+),?\s?)*?$/gm;


wird nur das letzte match in @argsteps gefüttert, auch

Code: (dl )
1
2
my @orgsteps; 
push @orgsteps, $1 while $ref =~ /^Stepnames=(?:(\w+),?\s?)*?$/gm;


liefert das selbe Ergebnis.

Gibt es keine Möglichkeit m// alle matches in list context zurückkommen zu lassen?

Was funktioniert ist natürlich

Code: (dl )
1
2
3
4
5
my @orgsteps; 
while ($ref =~ /^Stepnames=(.*?)$/gm) {
my $match = $1;
push @orgsteps, split /[,\s]/, $match;
}


aber das ist nun nicht wirklich elegant...
drum&bass is a state of mind
dukeofnukem
 2007-02-07 14:57
#74119 #74119
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
*argh* muß natürlich

Code: (dl )
push @orgsteps, split /,\s/, $match;


sein :rock:
drum&bass is a state of mind
Dubu
 2007-02-07 18:15
#74120 #74120
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=dukeofnukem,07.02.2007, 12:42]Gibt es keine Möglichkeit m// alle matches in list context zurückkommen zu lassen?[/quote]
Was du zurück bekommst, sind schon alle Matches. Deine gesamte Regex kann nämlich nur genau einmal auf den String passen, auch wenn sie Unterausdrücke enthält, die mehrfach passen. Leider bekommst du als Ergebnis nur die (letzten) Inhalte aller explizit aufgeführten Klammerpaare.

Du könntest die Regex aber modifizieren, ohne viel an Genauigkeit zu verlieren:
Code: (dl )
my @orgsteps = $ref =~ /(?:^Stepnames=|,\s*)(\w+)/g;

Hier passt die gesamte Regex mehrfach auf den String $ref, sodass alle Ergebnisse gefunden werden.\n\n

<!--EDIT|Dubu|1170865017-->
<< >> 3 Einträge, 1 Seite



View all threads created 2007-02-07 13:42.