in reply to Parsing Challenge

How about this:

#!/usr/bin/perl -w ############################################################### use strict; use Data::Dumper; my $data=qq(key1=value1 key2=value2 key3=value3 key4=value4); my $v={}; foreach my $pair (split(' ',$data)) { my($key,$value)=split('=',$pair); $v->{$key}=$value; } print Dumper($v);

Yields:

$VAR1 = { 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3', 'key4' => 'value4' };

Alternatively you can do the following with the same results

#!/usr/bin/perl -w ############################################################### use strict; use Data::Dumper; my $data=qq(key1=value1 key2=value2 key3=value3 key4=value4); my $v={}; map { my($k,$vl) = split('=',$_); $v->{$k}=$vl; } split(' ',$data); print Dumper($v);

HTH


Peter L. BergholdSchooner Technology Consulting, Inc.
Peter@Berghold.Netwww.berghold.net

Replies are listed 'Best First'.
Re: Re: Parsing Challenge
by no_slogan (Deacon) on May 24, 2001 at 22:37 UTC
    Some of the keys have multiple values, though. You could remember the last key...
    foreach (split " ", $data) { if (/^([^=]*)=(.*)/) { $hash{$last=$1}=$2 } elsif (defined $lastkey) { $hash{$last} .= " $_" } }
    Since "key=" is easy to recognize, another way would be to use split:
    %hash = ("JUNK", split /([^=\s]*)=/, $data)
    if you don't mind the JUNK, that is.

      What if the literal "key" is not always present? What if the pairs become:

      my $data="fruit=apple meat=steak ....";


      Peter L. BergholdSchooner Technology Consulting, Inc.
      Peter@Berghold.Netwww.berghold.net