Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

Re^4: I need to insert spaces and get the values for all the variables

by Eily (Parson)
on Sep 04, 2013 at 09:16 UTC ( #1052265=note: print w/replies, xml ) Need Help??

in reply to Re^3: I need to insert spaces and get the values for all the variables
in thread I need to insert spaces and get the values for all the variables

I find this solution to be very nice and elegant, probably because I would never have thought of it :).

I'm sure there's a module somewhere out there that allows you to merge several hashes into a hash of arrays, which may be a more convenient structure depending on what you want to do with it.

Here is another way to get those values in a AoH without the multiple m problem :

use strict; use warnings; use Data::Dumper; my %store; # put the results in here while (<DATA>) { while(m< (\w+) = "((?:[^"\\]|\\.)+)" >gx) { # $store{$1} ||= []; ## useless: see hdb's answer below push @{ $store{$1} }, $2; # or push @array, {$. => $2} if you +want to keep track of the line of definition } } print Dumper \%store; # Look what we got __DATA__ dvgqu="0"vgrq="0"w="0"devce="db"elped_me="0"r="0"rmb="0"rrqm="0"vcm="0 +"ul="0"w="0"wmb="0"wrqm="0" dvgqu="0.00"vgrq="58.91"w="0.09"devce="d"elped_me="1"r="0.00"rmb="0.00 +"rrqm="0.00"vcm="0.09"ul="0.05"w="5.50"wmb="324.00"wrqm="35.00"
$VAR1 = { 'ul' => [ '0', '0.05' ], 'w' => [ '0', '0', '0.09', '5.50' ], 'vgrq' => [ '0', '58.91' ], 'r' => [ '0', '0.00' ], 'rrqm' => [ '0', '0.00' ], 'elped_me' => [ '0', '1' ], 'devce' => [ 'db', 'd' ], 'dvgqu' => [ '0', '0.00' ], 'wrqm' => [ '0', '35.00' ], 'rmb' => [ '0', '0.00' ], 'vcm' => [ '0', '0.09' ], 'wmb' => [ '0', '324.00' ] };

Replies are listed 'Best First'.
Re^5: I need to insert spaces and get the values for all the variables
by hdb (Prior) on Sep 04, 2013 at 09:26 UTC

      Oh, right. I knew about autovivification already, but since @array = @{ $hash{key} } (when %hash is empty) is an error under strict I thought that push @{ $hash{key} }, 'value' would be too. But I forgot that Perl is smarter than me.

      I'm working on v5.8.3 here, so I can't test that right now, but I suppose that in the case of mypush(+@) you'd still get an error.

      Thanks for correcting me :) (Edit: as in making me learn a bit about Perl)

      Edit: oh wait, I don't need the + prototype to try that (I guess someone's tired, and that someone is sitting on my very chair):

      use strict; use warnings; use Data::Dumper; sub mypush(\@@) { push @{ shift; }, @_ } my %hash; mypush @{ $hash{key} }, "Hello", "World"; print Dumper \%hash;
      $VAR1 = { 'key' => [ 'Hello', 'World' ] };
      So it works alright. I really should trust Perl more. Edit: The linux computer to which I'm connected via SSH uses v5.14.2. It works just fine with + as well.

        There is no intention on my side to do any correcting, especially as your code is working Perl code and probably even easier to understand than the shorter form.

        I just wanted to point out that some typing could be safed if you wanted.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1052265]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (5)
As of 2017-08-17 08:24 GMT
Find Nodes?
    Voting Booth?
    Who is your favorite scientist and why?

    Results (284 votes). Check out past polls.