in reply to Re: better way to convert a string into an array and an hash
in thread better way to convert a string into an array and an hash

You are using s///ge only for the side effects of the code in the substitution part. Why do you need a substitution then? You could just as well say

use warnings; use strict; my $string = "1:1,2:1,3:2,500:2,505:1"; my (@array, %hash); while ($string =~ /(\d+):(\d+)(?:,|$)/g) { $hash{$1}=$2;push(@array, $1) }; use Data::Dumper; print Dumper(\@array, \%hash);

Replies are listed 'Best First'.
Re^3: better way to convert a string into an array and an hash
by fergal (Chaplain) on Oct 05, 2004 at 20:50 UTC

    Simply because it gives you a free loop. I first saw this idiom about 10 years ago for decoding a cgi params into a hash. Something like

    $p =~ s/(.*?)=(.*?)(&|$)/$v=$2;$v=~s/%(..)/chr(hex($1))/ge;$p{$1}=$v/g +e
    a substitution within a substiution!

    I also thought it might be quicker but after a quick benchmark it seems not.

    I suppose I could have used

    [/(\d+):(\d+)(?:,|$)(?{$hash{$1}=$2;push(@array, $1);1})/g];
    for a free loop without destroying the string but isn't much faster.