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'
]
};
|