Domanda

I've got a HoHoA declared as such:

Input:

six1    XLOC_000118_0.779368:6.54933,_Change:3.07097,_p:0.0041,_q:0.384698  98.56   gi|65102|emb|X07318.1|_Xenopus_laevis_U3_snRNA
six1    XLOC_000119_0.513953:3.88566,_Change:2.91845,_p:0.00305,_q:0.352441 97.74   gi|65102|emb|X07318.1|_Xenopus_laevis_U3_snRNA
six1    XLOC_000120_0.20564:1.71294,_Change:3.05828,_p:0.0499,_q:0.998475   97.72   gi|65102|emb|X07318.1|_Xenopus_laevis_U3_snRNA
six1    XLOC_000156_24.4984:46.2343,_Change:0.916274,_p:0.036,_q:0.998475   99.66   gi|475392713|dbj|AB759708.1|_Xenopus_laevis_PhyHd_mRNA_for_phytanoyl-CoA_dioxygenase_like_protein,_complete_cds
six1    XLOC_000159_47.4513:129.702,_Change:1.45068,_p:5e-05,_q:0.025683    98.11   gi|12007283|gb|AF310008.1|_Xenopus_laevis_putative_transmembrane_protein_TA-2_mRNA,_complete_cds
six1    XLOC_000360_4871.65:887.169,_Change:-2.45713,_p:0.01895,_q:0.932076 90.83   gi|166006832|gb|BC158454.1|_Xenopus_tropicalis_cDNA_clone_IMAGE:6991249
six1    XLOC_000441_3.2887:14.6726,_Change:2.15754,_p:0.0176,_q:0.886907    86.96   gi|49115451|gb|BC073380.1|_Xenopus_laevis_Cysteine_and_histidine-rich_protein_1A,_mRNA_(cDNA_clone_IMAGE:5513813),_partial_cds
six1    XLOC_000456_0.781282:1.82923,_Change:1.22732,_p:0.0448,_q:0.998475  100.00  gi|291419709|gb|GU725438.1|_Xenopus_laevis_runt-related_transcription_factor_3_(Runx3)_mRNA,_complete_cds
eya1    XLOC_000577_4.51367:2.36674,_Change:-0.931399,_p:0.0266,_q:0.998475 89.68   gi|512838432|ref|XM_002935635.2|_PREDICTED:_Xenopus_(Silurana)_tropicalis_hyaluronoglucosaminidase_1_(hyal1),_mRNA
eya1    XLOC_000639_1.97849:5.08116,_Change:1.36076,_p:0.02,_q:0.963795 100.00  gi|147898581|ref|NM_001094479.1|_Xenopus_laevis_histone_cluster_1,_H2aj_(hist1h2aj),_mRNA
eya1    XLOC_000838_0.907085:2.91695,_Change:1.68515,_p:0.0012,_q:0.233803  89.61   gi|283799550|emb|FN550108.1|_Xenopus_(Silurana)_tropicalis_mRNA_for_alpha-2,3-sialyltransferase_ST3Gal_V_(st3gal5_gene)
eya1    XLOC_000906_0.831191:2.33687,_Change:1.49132,_p:0.03045,_q:0.998475 91.02   gi|148223430|ref|NM_001092286.1|_Xenopus_laevis_HECT_and_RLD_domain_containing_E3_ubiquitin_protein_ligase_family_member_6_(herc6),_mRNA
eya1    XLOC_000993_1.93915:3.92975,_Change:1.01901,_p:0.0271,_q:0.998475   99.85   gi|148234446|ref|NM_001095481.1|_Xenopus_laevis_GRAM_domain_containing_3_(gramd3),_mRNA
eya1    XLOC_001130_0.15212:1.70739,_Change:3.48852,_p:0.01285,_q:0.726057  92.37   gi|112807523|emb|CU075479.1|_Xenopus_tropicalis_finished_cDNA,_clone_THdA030p05
eya1    XLOC_001184_0.620541:3.46599,_Change:2.48167,_p:0.00655,_q:0.499758 97.95   gi|65102|emb|X07318.1|_Xenopus_laevis_U3_snRNA
eya1    XLOC_001364_0.945792:2.66698,_Change:1.49561,_p:0.0478,_q:0.998475  99.75   gi|2598062|emb|AJ001730.1|_Xenopus_laevis_mRNA_for_Xsox17-alpha_protein
eya1    XLOC_001624_18.5985:34.7338,_Change:0.901154,_p:0.0111,_q:0.66721   100.00  gi|147905253|ref|NM_001090340.1|_Xenopus_laevis_serum/

Assign various values to HoHoA:

while (<$fh>) { 
        chomp;
        my $condition = $1 if ($_ =~  /(^\w+\d+)/);
        my $xloc = $1 if ($_ =~ /(XLOC_\d+)/);
        my $change = $1 if ($_ =~ /Change:(-?\d+\.\d+|-?inf)/);
        my $q_value = $1 if ($_ =~ /q:(\d+\.\d+)/);
        my @split = split('\t');
        my $percent_id = $split[2];
        my $gene = $split[3];
        $experiment{$gene}{$condition} = [ $xloc, $change, $q_value, $percent_id ];
    }

I now want to cycle through the keys/values and print them out. However before doing so I need to do some comparisons on value (and therefore need to access each value for each combination of hash keys). With the indicated lines commented out, the code below works, but as such I am unable access the individual values. How can I properly dereference for this data structure?

    for my $gene (sort keys %experiment) { 
    for my $condition ( sort keys %{$experiment{$gene}} ) {
        print "$gene\t$condition\t";
            for my $values (@{$experiment{$gene}{$condition}} ) {
#               my ($xloc, $change, $q_val, $percentage) = @$values; # How can I dereference properly here...
#               print "[$xloc\t$change\t$q_val\t$percentage]"; #...to print out like this?
                print "[$values]\t";
            }
        print "\n";
     }
}

This prints (1st few lines only):

gi|110289870|emb|CU025180.1|_Xenopus_tropicalis_finished_cDNA,_clone_THdA035f23 six1    [XLOC_000990]   [inf]   [0.100767]  [88.02] 
gi|112807523|emb|CU075479.1|_Xenopus_tropicalis_finished_cDNA,_clone_THdA030p05 eya1    [XLOC_001130]   [3.48852]   [0.726057]  [92.37] 
gi|112807523|emb|CU075479.1|_Xenopus_tropicalis_finished_cDNA,_clone_THdA030p05 six1    [XLOC_001146]   [4.52249]   [0.999592]  [92.37] 
gi|12007283|gb|AF310008.1|_Xenopus_laevis_putative_transmembrane_protein_TA-2_mRNA,_complete_cds    six1    [XLOC_000159]   [1.45068]   [0.025683]  [98.11] 
gi|147898581|ref|NM_001094479.1|_Xenopus_laevis_histone_cluster_1,_H2aj_(hist1h2aj),_mRNA   eya1    [XLOC_000639]   [1.36076]   [0.963795]  [100.00]    
gi|147903202|ref|NM_001097651.1|_Xenopus_laevis_forkhead_box_I4,_gene_1_(foxi4.1),_mRNA six1    [XLOC_000837]   [1.16613]   [0.532793]  [99.89] 
È stato utile?

Soluzione

The third for loop is not necessary.

for my $gene (sort keys %experiment) { 
    for my $condition ( sort keys %{$experiment{$gene}} ) {

        print "$gene\t$condition\t";
        my ($xloc, $change, $q_val, $percentage) = @{$experiment{$gene}{$condition}};
        ...
        print "\n";
     }
}

Altri suggerimenti

You already dereferenced your arrayref in the line

for my $values ( @{$experiment{$gene}{$condition}} )

Instead of the innermost loop, I suspect what you really want is

my ($xloc, $change, $q_val, $percentage) = @{$experiment{$gene}{$condition}};

$experiment{$gene}{$condition} is reference to an array. So you can simply use the following to dereference it. The third nested loop is not required if you do not want to iterate over the elements of this array.

my ($xloc, $change, $q_val, $percentage) = @{$experiment{$gene}{$condition}};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top