Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re^2: variable as hash name

by blackzero (Acolyte)
on Dec 08, 2012 at 10:25 UTC ( [id://1007885]=note: print w/replies, xml ) Need Help??


in reply to Re: variable as hash name
in thread variable as hash name

You see, is not that I'm not open to alternatives. Is just that I read a lot of foruns adressing this problem (of use variavles as variables name) and as much as I tried, I was unable to use hash of hashes to solve my needs.

So I wanted to use the dirt way because I needed to solve it fast. But YES, I would like to improve my code to not have to disable strict. And I am thankfull for your help.

So here is the code I'm using now. Any improvement is welcome.

#!/usr/bin/perl #use strict; use warnings; my $input_data = << 'REPORT_OF_INPUT'; Bet01;;Bet05;;Bet06;;Bet12;; 230;238;101;103;138;146;112;116;; 230;238;101;103;146;146;108;112;; 224;238;0;0;146;146;110;118;; 238;238;0;0;146;146;112;114;; REPORT_OF_INPUT my @inputs = split "\n", $input_data; my $line = shift @inputs; $line =~ s/;;/;/g; my @loci_codes = split ";", $line; foreach $line ( @inputs ) { my @alelos = split ";", $line; foreach my $locus ( @loci_codes ) { no strict 'refs'; my $allele1 = shift @alelos; my $allele2 = shift @alelos; ${$locus}{$allele1} += 1; ${$locus}{$allele2} += 1; } } foreach $locus ( @loci_codes ) { foreach my $key ( keys ( %{$locus} ) ) { print "$locus ", $key, " = ", $$locus{$key}, "\n"; } }

I'm using the data inside the code here just to make it easier for decode. But in my real program the content of $input_data will come from an external file. So its content may vary.

Replies are listed 'Best First'.
Re^3: variable as hash name
by tobyink (Canon) on Dec 08, 2012 at 10:42 UTC

    Here's your program modified to work with use strict:

    #!/usr/bin/perl use strict; use warnings; my $input_data = << 'REPORT_OF_INPUT'; Bet01;;Bet05;;Bet06;;Bet12;; 230;238;101;103;138;146;112;116;; 230;238;101;103;146;146;108;112;; 224;238;0;0;146;146;110;118;; 238;238;0;0;146;146;112;114;; REPORT_OF_INPUT my @inputs = split "\n", $input_data; my $line = shift @inputs; $line =~ s/;;/;/g; my @loci_codes = split ";", $line; my %LOCI; foreach my $line ( @inputs ) { my @alelos = split ";", $line; foreach my $locus ( @loci_codes ) { my $allele1 = shift @alelos; my $allele2 = shift @alelos; $LOCI{$locus}{$allele1} += 1; $LOCI{$locus}{$allele2} += 1; } } foreach my $locus ( @loci_codes ) { foreach my $key ( keys ( %{$LOCI{$locus}} ) ) { print "$locus ", $key, " = ", $LOCI{$locus}{$key}, "\n"; } }

    Is that so hard?

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

      tobyink solution really worked!

      I implemented it in my real code and its working nicely.

      Sorry if I was a bit rude. I was really stressed with that problem. This hash of hashes thing seems really trick when I look at it in other forums. As you can guess, I'm new at perl programming. I know that is not excuse.

      Thank you very much for the help

      . .

      o/

      That worked!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1007885]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (6)
As of 2024-03-19 09:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found