> -----Original Message-----
> From: Chas. Owens [mailto:[EMAIL PROTECTED]
> Sent: Friday, January 18, 2008 9:07 PM
> To: Kevin Viel
> Cc: [email protected]
> Subject: Re: Hash of hashes?
>
> On Jan 18, 2008 6:06 PM, Kevin Viel <[EMAIL PROTECTED]> wrote:
> > This I cannot get my mind around...
> >
> > My data:
> >
> > SNP Genotype
> > 1 CC
> > 1 CT
> > 1 TT
> > 1 NN
> >
> >
> > It seems to me that I need a hash of hashes.
> >
> > Inner hash:
> >
> > $inner{ $Genotype }++ ;
> >
> > Since the value of the out hash ( $outer{ $SNP } ) has to
> be a scalar,
> > this scalar has to be a reference to the inner hash,
> correct? If so,
> > how do I declare them?
> >
> > my %outer ;
> snip
>
> In general you only declare the outer hash. Perl uses some
> magic called autovivication to create the inner hash references.
>
> #!/usr/bin/perl
>
> use strict;
> use warnings;
> use Data::Dumper;
>
> my %data; #pick a better name
> while (<DATA>) {
> my ($snp, $genotype) = split;
> $data{$snp}{$genotype}++
> }
> print Dumper(\%data);
>
> __DATA__
> 1 CC
> 1 CT
> 1 TT
> 1 NN
> 2 CT
> 2 CT
> 2 CT
Thank you for your help.
> $data{$snp}{$genotype}++
Is the semicolon unnecessary for this line?
So, if I understand correctly $data{$snp} is a value in a hash. That value
is a scalar that happens, in this case, to be a reference to an anonymous
hash? The key of this anonymous hash is $genotype? It does not seem like
the simplicity of this lines relates the complexity of the object:
$data{ $snp }
$data{ $snp }{ $genotype }
####
Consider the code below:
#! /usr/bin/perl
use strict ;
use warnings ;
use Data::Dumper ;
my %outer ;
while ( <DATA> ) {
my ( $snp , $genotype ) = split , /\s+/ ;
my $allele1 = substr $genotype , 0 , 1 ;
$outer{ $snp }{ $allele1 }++ ;
my $allele2 = substr $genotype , 1 , 1 ;
$outer{ $snp }{ $allele2 }++ ;
}
print Dumper( \%outer ) ;
__DATA__
1 CC
1 CT
1 TT
1 NN
2 CC
#################
$VAR1 = {
'1' => {
'T' => 3,
'N' => 2,
'C' => 3
},
'2' => {
'C' => 2
}
};
My goal is to print all of the SNP (keys of outer) that have more than two
alleles (keys of the second anonymous hash). How can I achieve this?
for my $SNP_keys ( sort { $a cmp $b ) keys %outer ){
my $num_alleles = keys _______ ;
}
The values of outer, for instance $outer{ $num_alleles }, are scalar
(references to anonymous hashes). However, I cannot seem to dereference
them.
I appreciate any help.
Thank you,
Kevin
Kevin Viel, PhD
Post-doctoral fellow
Department of Genetics
Southwest Foundation for Biomedical Research
San Antonio, TX 78227
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/