in reply to Re^2: processing key value pairs of a hash
in thread processing key value pairs of a hash

but how do I print the value from the 'good' key in the hash of hashes?
Loop through the keys of the primary hash, and print out the 'good' values if 'good' keys exist:
use strict; use warnings; use Data::Dumper; my %clone_hash; while (<DATA>) { my ($key, $value) = split; my $grade = ($value =~ /^pass[1-3]$/) ? 'good' : 'bad'; $clone_hash{$key}{$grade}++; } #print Dumper(\%clone_hash); # Print out the 'good' keys for (keys %clone_hash) { print "$_ => $clone_hash{$_}{good}\n" if exists $clone_hash{$_}{go +od}; } __DATA__ Eif2b2 fail Eif2b2 pass5 Eif2b2 fail Eif2b2 pass2 Eif2b2 fail Eif2b2 pass4 Eif2b2 fail 49334 fail 49334 fail 49334 pass1 49334 fail 49334 pass4 Oxct1 pass4 Oxct1 fail Oxct1 pass4 Oxct1 fail

which prints:

Eif2b2 => 1 49334 => 1

Replies are listed 'Best First'.
Re^4: processing key value pairs of a hash
by lomSpace (Scribe) on Apr 15, 2009 at 16:45 UTC
    toolic
    Much thanks!
    LomSpace
Re^4: processing key value pairs of a hash
by lomSpace (Scribe) on Apr 15, 2009 at 18:42 UTC
    Hi toolic!
    I have tried several different ways to trying to get the 'bad' values from
    the hash of hashes. Some compile and others don't. The lit online is not
    clear to me. In my code you will see where I commented out my most
    recent attempt at printing the 'bad'.
    #!/usr/bin/perl use strict; use warnings; use Data::Dumper; =cut open( my $in, "c:/Documents and Settings/mydir/Desktop/current/mart_ex +port.txt" ); open( my $out, ">c:/Documents and Settings/mydir/Desktop/current/clone +_qual_counts.txt" ); my $first_line = <$in>; chomp $first_line; my %clone_hash; print $out "clone\tgood\tbad\n"; while (<$in>) { chomp; my @fields = split /\t/; my ($gene_symbol, $esc_qc) = ($fields[1], $fields[8]); #use regex to extend to a hash of hashes to separate good and bad +clone counts my $grade = ($esc_qc =~ /^pass[1-3]$/) ? 'good' : 'bad'; $clone_hash{$gene_symbol}{$grade}++; } for (keys %clone_hash) { #print $out "$_ \t $clone_hash{$_}{good}\n" if exists $clone_hash{ +$_}{good}; print $out "$_ \t$clone_hash{$_}{good}\n" if exists $clone_hash{$_ +}{good}; #print $out "\t$clone_hash{$_}->{'bad'}\n"; } #print Dumper(\%clone_hash); close ($in); close ($out);
    It is apparent that I am new to hash of hashes. I humbly appreciate you help.
    LomSpace
      untested...
      for (keys %clone_hash) { my $gcnt = (exists $clone_hash{$_}{good}) ? $clone_hash{$_}{good} +: 0; my $bcnt = (exists $clone_hash{$_}{bad} ) ? $clone_hash{$_}{bad} +: 0; print $out "$_\t$gcnt\t$bcnt"; }

      Update: removed erroneous "exists"

        Hi toolic!

        That was simple enough! Thanks for the introduction to hash of hashes.

        Thanks!

        LomSpace