in reply to Please help with Hash Key,value issue

You should consider pushing your values into a Hash-of-arrays structure:
use strict; use warnings; use Data::Dumper; my %data; while (<DATA>) { my ($k, $v) = split; push @{ $data{$k} }, $v; } print Dumper(\%data); __DATA__ k1 5 k2 3 k1 7

Prints out:

$VAR1 = { 'k2' => [ '3' ], 'k1' => [ '5', '7' ] };

Replies are listed 'Best First'.
Re^2: Please help with Hash Key,value issue
by mmittiga17 (Scribe) on Mar 11, 2009 at 18:52 UTC
    Ok, I got myself to this point and am trying to read up on hash or arrays but. I cant figure out how to access each line I need to access as I was in my code sample.
    This prints out what I want via Dumper: my $data = "GCUS.GCUS";my %userData;open(inData, $data);while (<inData +>) { chomp; $line = $_; if ($line =~/^GC/){ my $ACTNUM = substr $line, 11, 9 ; my $ref = substr $line, 0, 3 ; push @{ $userData{$ACTNUM} }, $ref = $line; } } Here is where I get stuck and cant seem to understand the perl doc: for $ACTNUM (sort keys %userData) { #########GCA############## my $line = $userData{$ACTNUM}{GCA}; $ACCTNUM = substr $line, 11, 9; $FIRM_ID = substr $line, 660, 1; $CURR = substr $line, 661, 3;
      I am not sure you understand the data structure that you want to see as output. The code you have given is not what you want. Notably you are saying push @{ $userData{$ACTNUM} }, $ref = $line;, which will overwrite $ref with the entire $line before pushing it onto $userData{$ACTNUM}. I think what you really want is something more like this:
      push @{ $userData{$ACTNUM}{$ref} }, $line;
      Now having done that, you must realize that $userData{$ACTNUM}{GCA} now contains a reference to a list of all the lines where $ref was "GCA". Which means you want something more like this to access it:
      for $ACTNUM (sort keys %userData) { for my $line (@{$userData{$ACTNUM}{GCA}}) { $ACCTNUM = substr $line, 11, 9; $FIRM_ID = substr $line, 660, 1; $CURR = substr $line, 661, 3; ...
      That is, you must now loop over all of the lines for every $userData{$ACTNUM}{$ref} to process their (possibly) multiple values.