[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