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

Toolic
I created an empty hash, then read in a file, split it and used
fields1 and fields4 to create key value pairs. I then sorted the list by keys.
I want the following type of output:
Clone Good Single Clone
Eif2b2 1 1

Thanks the hash of hashes answers the first part, but how do
I print the value from the 'good' key in the hash of hashes?

Thanks
LomSpace
  • Comment on Re^2: processing key value pairs of a hash

Replies are listed 'Best First'.
Re^3: processing key value pairs of a hash
by toolic (Bishop) on Apr 15, 2009 at 16:34 UTC
    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
      toolic
      Much thanks!
      LomSpace
      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"