in reply to Variable Abstraction with strict

You could reorganize your data structure and use HASHES OF ARRAYS
use warnings; use strict; my %hoa = ( a => [(1, 2, 3)], b => [(4, 5, 6)], c => [(7, 8, 9)], ); print "@{ $hoa{b} }\n"; __END__ 4 5 6

Replies are listed 'Best First'.
Re^2: Variable Abstraction with strict
by VingInMedina (Acolyte) on May 27, 2011 at 19:17 UTC

    Yes, that would work in this case, but in general, is there a correct way to perform this abstraction?

    What if I want to find the value to $$x, where $x is the name of the scaler variable I am interested in?

      Re-reading what you say you want, this seems to meet all your requirements:
      my (@a, @b, @c, @d); # create and populate arrays #Define a "Mapping hash": my %aref = (a=>@\a, b=>\@b, c=>\@c, d=>\@d ); # (Same as toolc's solution) my $x = "b"; # I want to access "@b" my $extracted_value_5_from_b = $aref{ $x }->[5]; my @entire_array_b_copy = @{ $aref{ $x } }; # Alternative, closer to the syntax you seek.. my $y = $aref{ b }; for ( @$y ){ # We are iterating through @b here ... } #-- Strict-compliant, maintainable version ... my $z=\@b; for ( @$z ){ # We are iterating through @b here ... }

           Syntactic sugar causes cancer of the semicolon.        --Alan Perlis

      Do you mean something like this ?
      perl -e "my (@a,@b,$x); @a=0..5;@b=20..25; for $x(\@a,\@b){print qq|@$ +x;\n|}"
      Prints:
      0 1 2 3 4 5;
      20 21 22 23 24 25;

           Syntactic sugar causes cancer of the semicolon.        --Alan Perlis