http://www.perlmonks.org?node_id=1007868


in reply to variable as hash name

PLEASE, don't tell me I dont want to do this. I want to do exactly what I said above. Not to use hash of hashes or anything else. I DO want to use a variable as a hash name and I'm aware of the risks.
To help you understand why you've copped a few downvotes, it would have been more polite to explain up front why you want to use symbolic references, rather than to issue a command to the unpaid volunteers who answer questions here. Understanding the why behind your question makes it more interesting for us and makes it more likely that others who read this node in the future will learn from it (this topic is discussed in more detail at the XY Problem). Please remember that this site is a community of Perl programmers, a community that encourages everyone to grow and learn from each other.

Anyway, welcome to the monastery. If you become involved in Perl monks, not just asking for help, but answering the questions of others, you should have a lot of fun and your Perl will improve out of sight.

Replies are listed 'Best First'.
Re^2: variable as hash name
by blackzero (Acolyte) on Dec 08, 2012 at 10:25 UTC

    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.

      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!