raulgh5 has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I have a doubt on Hash variable in Perl. In script, I see the below hash defined:
my %_abc;
and in some subroutines, I see this:
$_abc{"info"}->{$env}->{"Generic"}->{"Cat A"}=10; $_abc{"warning"}->{$env}->{"Generic"}->{"Cat B"}=20; ......
As the first variable is a hash, I suppose the $_abc are values in hash, but what is the use of -> here? Can someone explain to me the meaning of "->" here? My understanding is the elements of a hash are key/value pairs, thus, why we have 3 "->" here?

Replies are listed 'Best First'.
Re: doubts on perl Hash
by NetWallah (Canon) on Oct 12, 2015 at 05:37 UTC
    What you are dealing with is a structure that looks something like this:
    my %_abc=( info => { env=> {Generic => { "Cat A" => "Value A", "Cat B" => "Value B" } } } );
    Your code attempts to create or replace "Value A", and "Value B".

    Your ideas are correct .. One individual KEY has a single VALUE.

    However, that value can be a REFERENCE, which can contain an entire structure.

            Software efficiency halves every 18 months, thus compensating for Moore's Law.

Re: doubts on perl Hash
by kcott (Archbishop) on Oct 12, 2015 at 05:24 UTC

    G'day raulgh5,

    Welcome to the Monastery.

    The arrows after the $_abc{"info"} part are not wrong; however, they are not actually required. See perlreftut: Arrow Rule.

    Please post your code (and data) within <code>...</code> tags. What you have here is very difficult to read!

    — Ken

Re: doubts on perl Hash
by AppleFritter (Vicar) on Oct 12, 2015 at 09:21 UTC

    In addition to what's been said above, I'd like to throw some more links at you that may be useful in this and future scenarios:

    • perlop: The Arrow Operator
    • perldsc - Perl Data Structures Cookbook (introduction to/tutorial for nested data structures)
    • Data::Dumper - useful for debugging, to find out what structure your data has. For instance, in your case, you could do this:

      use feature qw/say/; use Data::Dumper; # ... say Dumper \%hash;

      ...and you'd immediately get a pretty good idea of what kinda structure %hash actually contains.

    Hope these help!

Re: doubts on perl Hash
by Anonymous Monk on Jul 07, 2017 at 09:05 UTC
    use strict; use warnings; use feature qw( say ); my @aa = ("A", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", +"P", "Q", "R", "S", "T", "V", "W", "Y"); my $pair; for my $n1 (@aa) { for my $n2 (@aa) { $pair = $n1 . $n2; } }
    these are the 20 amino acids and i have to make 400 possible combination of two amino acid (di amino acid) like this:
    AA AC AD ...... CA CC CD CE CF CG.....YA.....YY
    I TRIED TO MODIFY THE CODE but the scope of "for" loop diminishes when it ends. why it is ending there only, since i made the variable $pair as global only giving two Y's as output

      The code shown has no output: it simply overwrites the value of $pair with a new value on each iteration of the nested loops. So, if you add the statement say $pair; after both loops have finished, of course you see only the last value of $pair, which happens to be YY.

      To get all the values, you need to move the say statement into the inner loop:

      use strict; use warnings; use feature qw( say ); my @aa = qw(A C D E F G H I K L M N P Q R S T V W Y); my $pair; for my $n1 (@aa) { for my $n2 (@aa) { $pair = $n1 . $n2; say $pair; } }

      As an alternative, you could store the pairs in an array and output them after the loops have finished:

      use strict; use warnings; use feature qw( say ); my @aa = qw(A C D E F G H I K L M N P Q R S T V W Y); my @pairs; for my $n1 (@aa) { for my $n2 (@aa) { push @pairs, $n1 . $n2; } } say for @pairs;

      Hope that helps,

      Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,