in reply to doubts on perl Hash

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

Replies are listed 'Best First'.
Re^2: doubts on Perl hash
by Athanasius (Archbishop) on Jul 08, 2017 at 05:55 UTC

    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,