Reference Tricks With Grep and Map
#!/usr/bin/perl -w
###################  Reference Tricks With Grep and Map  ######################

$rLoL = [[20,30], [40,50,60], [10]];  #  Reference to List of List

##  Converting $rLoL into a simple one dimensional list

@NormalList = map {@$_} @$rLoL;  #  $_ is a list REFERENCE!
print "@NormalList\n";

##  "Deep Copying" (cloning) $rLoL into another reference.

@$rClone = map {[@$_]} @$rLoL;   #  Expand $_'s array into a NEW ADDRESS!
$rLoL->[1][1] = 95;   
foreach $ref (@$rClone) {print "@$ref\n"} # Clone should NOT have the 95 in it!
foreach $ref (@$rLoL)   {print "@$ref\n"} 

##  Removing lists from a list of lists by a certain criterion.

@$rLoL = grep {@$_ >= 2} @$rLoL;  #  Lists of size 1 or 0 should disappear! 
foreach $ref (@$rLoL)   {print "@$ref\n"} 

##  "Deep Copying" (cloning) a List of Hash.

@LoH = ({"a" => 1, "b" => 4}, {"c" => 2}, {"a" => 6, "b" => 5, "d" => 7});
@NewLoH = map {{%$_}} @LoH;   #  Expand $_ inside new hash address braces
foreach $href (@NewLoH) {     #  Do a dump to see if the cloning worked.
   foreach $key (sort keys %$href)
   {
       print "$key $href->{$key} ";
   }
   print "\n";
}
 
##  Case Study: Keeping lists that have at least one score above some value. 
  
$value = 75;
$rLoL  = [[78,43,87], [64,73,72], [99], [65,67,71]];
@$rLoL = grep {(grep {$_ > $value} @$_) >= 1} @$rLoL;  # Inside grep is SCALAR!
foreach $ref (@$rLoL) {print "@$ref\n"}   #  Should keep only 1st and 3rd list.

##  Case Study: Dereferencing one row of a list of lists.
$rLoL = [[1,2], [3,4], [5,6], [7,8]];
print "@{$rLoL->[2]}\n";  #  Prints 5 6.  When you deref. a name with a
                          #  subscript, the deref must be surrounded by {}.
################################  Program Output  #############################

20 30 40 50 60 10   #  One dimensional array after 2-D array was "flattened".

20 30      #  Rows of the clone of original @$rLoL
40 50 60
10
20 30      #  Rows of the original @$rLoL after $rLoL->[1][1] changed to 95. 
40 95 60
10

20 30      #  Two rows of @$rLoL left after grep removed the list of size ONE.
40 95 60

a 1 b 4    #  One hash dumped per line.
c 2 
a 6 b 5 d 7 

78 43 87   #  Notice that these lists have at least ONE value above 75!
99

5 6        #  Results of dereferencing one row of a referenced list of lists.