in reply to Splitting strings with enclosed delimiters

I'd still use a regex to collect the contents of the lines :

use strict; my $line; while ($line = <DATA>) { chomp $line; print $line,"\n"; while ($line =~ s/(?:^([^" ]+)|^"([^"]+)")(?: |$)//) { print ">>>",$1||$2,"\n"; print $line,"\n"; }; }; __DATA__ "72 3267S" "S2079" 1 no "72 0250" "S3011" 1 no "72 8351S" "S6101" 1 no "72 17082S" "S6108" 1 no

The regex nibbles from the start of each line either something starting with a non-quote, or a quote and then everything including the ending quote and the separating space. At the end of a line, no space is allowed.

perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web

Replies are listed 'Best First'.
•Re: Re: Splitting strings with enclosed delimiters
by merlyn (Sage) on Oct 03, 2002 at 18:45 UTC
    Nibbling regex are expensive. Change it to a scalar m/\G.../g walk, and you have a winner:
    use strict; my $line; while ($line = <DATA>) { chomp $line; print $line,"\n"; while ($line =~ m/\G(?:([^" ]+)|"([^"]+)")(?: |$)/g) { print ">>>",$1||$2,"\n"; print $line,"\n"; }; }; __DATA__ "72 3267S" "S2079" 1 no "72 0250" "S3011" 1 no "72 8351S" "S6101" 1 no "72 17082S" "S6108" 1 no

    -- Randal L. Schwartz, Perl hacker