Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Please help with Hash Key,value issue

by mmittiga17 (Scribe)
on Mar 11, 2009 at 17:23 UTC ( [id://749960]=perlquestion: print w/replies, xml ) Need Help??

mmittiga17 has asked for the wisdom of the Perl Monks concerning the following question:

Hi All, I have this has I built by readying in a file:
my %userData; open(inData, $data); while (<inData>) { chomp; $line = $_; if ($line =~/^GC/){ my $ACTNUM = substr $line, 11, 9 ; my $ref = substr $line, 0, 3 ; $userData{$ACTNUM}{$ref} = $line; } } for my $ACTNUM (sort keys %userData) { $line = $userData{$ACTNUM}{GCA}; $ACCTNUM = substr $line, 11, 9; $FIRM_ID = substr $line, 660, 1; $CURR = substr $line, 661, 3; print "$CURR,$ACCTNUM,$FIRM_ID\n"; }
Problem is there can be multiple instances of the same key and value. However I am only able to return the first instance of it to print out. What Am I doing wrong here? Thanks MM 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;

Replies are listed 'Best First'.
Re: Please help with Hash Key,value issue
by CountZero (Bishop) on Mar 11, 2009 at 17:47 UTC
    In a hash, all keys must be unique (that's why they are called "keys'). You probably want to use a Hash of Arrays, in other words: the value associated with each key is itself an array in which you can store the multiple instances of your data for this key. And of course inside your Array you can have hashes or other arrays as needed. Check perldoc perlreftut and perldoc perlref.

    CountZero

    A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

Re: Please help with Hash Key,value issue
by toolic (Bishop) on Mar 11, 2009 at 17:52 UTC
    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' ] };
      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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://749960]
Approved by toolic
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (3)
As of 2024-04-25 13:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found