1
2
3
4
5
6
7
8
$line="P1::Va=Wb,P2::Vc=Wd,P1::Ve=Wf,P3::Vx=Wy,";
printf "\n$line\n";
if($line =~ /(.*),(.*::.*=.*)/){
printf "\n$1\n";
printf "\n$2\n";
}
1 2 3
my $line = "P1::Va=Wb,P2::Vc=Wd,P1::Ve=Wf,P3::Vx=Wy,"; my @comps = $line =~ m{\w+::\w+=(?:[^,]|,\d)*}g;
2009-05-11T14:45:07 betterworldVielleicht ungefähr so (ungetestet):
Code (perl): (dl )1 2 3my $line = "P1::Va=Wb,P2::Vc=Wd,P1::Ve=Wf,P3::Vx=Wy,"; my @comps = $line =~ m{\w+::\w+=(?:[^,]|,\d)*}g;
Dabei soll der Teil (?:[^,]|,\d) auf alle Zeichen, die kein Komma sind, oder auf Kommas, denen eine Ziffer nachsteht, matchen.
2009-05-11T15:10:19 tobyEDIT: Das einzige, was ich noch verändern müsste ist \w+ gegen .*, damit ich auch im Namen des Präfixes und Variablen unabhängig bin, da dort z.B. mit "-" gerechnet werden muss.
2009-05-11T18:06:34 betterworld2009-05-11T15:10:19 tobyEDIT: Das einzige, was ich noch verändern müsste ist \w+ gegen .*, damit ich auch im Namen des Präfixes und Variablen unabhängig bin, da dort z.B. mit "-" gerechnet werden muss.
Und das funktioniert? .* ist ja eigentlich greedy, daher würde ich erwarten, dass es auch alle darauffolgenden "::" gleich mitnimmt. Aber falls du den Rest meines Regexes verstanden hast, sollte es Dir auch nicht schwerfallen, es zu erweitern.
my @comps = $line =~ m{[^,:]+::\w+=(?:[^,]|,\d)*}g;