gudn tach Danni!
ich versteh zwar nicht warum, aber es funktioniert super.
ok.
hast du dir mal die beispiele im manual angeschaut? hast du die verstanden?
wesentlich ist ja eigentlich bloss die zeile
while(/\G(.{40}\S{0,10}\s?)/gc)
schauen wir also zunaechst eine abgespeckte variante davon an:
$_ = 'foo1_foo2';
$_=~/(foo.)/;
diese zeile prueft, ob der string $_ den string "foo." enthaelt, wobei der punkt ein beliebiges zeichen darstellt, und speichert der klammern wegen ggf. den gematchten teilstring in $1 ab. (siehe perldoc perlre und dort nach "$1" suchen).
das laesst sich nach perl-art verkuerzen zu
/(foo.)/;
wird nun $1 ausgegeben, erhaelt man "foo1";
was passiert aber wenn man noch mal /(foo.)/; ausfuehrt?
beispiel:
~~~perl
$_ = 'foo1_foo2';
print $1,"\n" if /(foo.)/; # prints "foo1"
print $1,"\n" if /(foo.)/; # prints "foo1"
denn nach jeder regexp-anwendung, wird ein interner zeiger auf die position des gematchten strings zurueckgesetzt...
...es sei denn, man setzt den g-modifier. das obige beispiel aendert sich dadurch wie folgt:
~~~perl
$_ = 'foo1_foo2';
print $1,"\n" if /(foo.)/g; # prints "foo1"
print $1,"\n" if /(foo.)/g; # prints "foo2"
denn beim zweiten aufruf von /(foo.)/g; wird nicht ganz vorne in $_ versucht, eine entsprechung zu finden, sondern erst ab dem ende des letzten gematchten teilstrings. die position des zeigers kann man mittels pos abfragen:
~~~perl
$_ = 'foo1_foo2';
print $1,"\n" if /(foo.)/g; # prints "foo1"
print pos,"\n"; # prints 4
print $1,"\n" if /(foo.)/g; # prints "foo2"
print pos,"\n"; # prints 9
(ohne g-modifier ist pos undefined)
der g-modifier verhindert allerdings kein zuruecksetzen, falls ein matchen fehlschlaegt. dazu wieder ein beispiel:
~~~perl
$_ = 'foo1_foo2';
print $1,"\n" if /(foo1)/g; # prints "foo1"
print pos,"\n" if defined pos; # prints 4
print $1,"\n" if /(foo1)/g; # setzt den zeiger zurueck
print pos,"\n" if defined pos; # tut nix
der c-modifier verhindert das zuruecksetzen im falle des nicht-matchens
~~~perl
$_ = 'foo1_foo2';
print $1,"\n" if /(foo1)/gc; # prints "foo1"
print pos,"\n" if defined pos; # prints 4
print $1,"\n" if /(foo1)/gc; # tut nix
print pos,"\n" if defined pos; # prints 4
so, jetzt fehlt bloss noch \G. das \G symbolisiert die stelle, an welcher der zeiger zuletzt war, also pos. moechte man, dass die foo.-teilstrings direkt hintereinanderstehen, ohne dass was dazwischen steht (wie in diesem fall der underscore "\_"), dann kann man mit \G quasi einen anker werfen.
dazu wieder ein beispiel:
~~~perl
$_ = 'foo1_foo2';
print $1,"\n" if /\G(foo.)/gc; # prints "foo1"
print pos,"\n" if defined pos; # prints 4
print $1,"\n" if /\G(foo.)/gc; # tut nix, denn "\Gfoo." matcht "_foo2" nicht.
print pos,"\n" if defined pos; # prints 4
print $1,"\n" if /\G_(foo.)/gc; # prints "foo2"
print pos,"\n" if defined pos; # prints 9
vielleicht ist jetzt auch verstaendlicher, was perldoc mit "The \G assertion can be used to chain global matches" meint.
so, jetzt alles klar? falls nicht frag, falls doch, sag, dass alles klar ist. wehe, du antwortest aber gar nicht! ;-)
prost
seth