[linux] Re: perl uitdaging
Remko Bolt
remko op cluebox.org
Wo mei 16 17:35:36 CEST 2007
Hugo van der Kooij wrote:
> "00:11:50:A8:41:BE","I\uffffm a wireless G, baby!",11,182,"Y","5200.4560 N","00442.6593 E"
>
> Normaal splits ik de velden met:
>
> @fields = split(/,/,$ThisLine);
>
> Maar dat gaat hier natuurlijk falikant fout.
Leuk, zit net `Mastering Regular Expressions' van Jeffrey Friedl te
lezen en het is een van zijn voorbeelden:
<code>
@fields = ();
push( @fields, $+ ) while $ThisLine =~ m{
"([^"\\]*(?:\\.[^"\\]*)*)",? # quoted string with possible comma.
| ([^,]+),? # anything else with possible comma.
| , # lone comma.
}gx;
# add final empty field if there is a trailing comma.
push( @fields, undef ) if substr( $ThisLine, -1, 1 ) eq ',';
</code>
De bovenste regex is een geoptimaliseerde versie van: "(\\.|[^"\\]+)*",?
waarbij het belangrijk is dat je (dit|dat) gebruikt en niet (dat|dit).
Maar uiteraard is code hergebruik zoals Ton voorstelde over het algemeen
de elegantere oplossing (ten zij je niet die hele lib wil hoeven te laden).
Gr,
Remko
More information about the Linux
mailing list