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

hi there,
I am using split to separate data on a single line into 2 pieces,
then trying to store these into the hash %species with the first bit of info ($id) as a key.
while (<MYFILE>) #this is my opened file { { next if /^\s*File/; #remove line starting with filename ($id, $seq) = split; push @{$species{$id}}, (split //, $seq); }
The data is in several blocks like this:
ID1 sequence here...
ID2 sequence here...
ID3 sequence here...

ID1 sequence here...
ID2 sequence here...
ID3 sequence here...

I would like all the sequence on ID1 lines to be stored with
ID1 as the key, all the ID2 sequences in one array etc.

Also I wondered why when I use this code:
while (($key, $sequence)=each %species) { print $key,$sequence; print "\n"; }
what I get printed is the key and then a load of numbers probably relating to where the value is stored rather than the value itself being printed.

How would I print key then value ?

Thanks a lot,
newbie

Replies are listed 'Best First'.
Re: newbie hashes question
by Trimbach (Curate) on Jun 05, 2002 at 11:32 UTC
    What you want to create is a hash of arrays. Your code was close, although I'm not sure why you split $seq again... (unless $seq contains a list of items you need to break out, in which case you want a hash of arrays of arrays). Something like this should work:
    while (<MYFILE>) #this is my opened file { { next if /^\s*File/; #remove line starting with filename my ($id, $seq) = split; # The my is important push @{$species{$id}}, $seq; } } # later... while ( ($key, $sequence) = each %species ) { print $key, "\t", join ":", @$sequence; } # Which will out your key, followed by a tab, # followed by all your sequences (however many # there are) separated by colons
    Refer to perlman:perlref for more details on references and why they're a good thing. If you need a hash of arrays of arrays that's not a problem, but it complicates the assignment and de-referencing of your hash, and is an exercise left to the reader. :-D

    Gary Blackburn
    Trained Killer

    Edited: after re-reading what the poster really wanted.