 # This subroutine modifies its parameter list 
 #    by changing the first element

 use English;

 sub changefirst1
 {
    print "@ARG\n";
    print "$ARG[0]\n";
    $ARG[0] = 99;
 }

 # Call it
 @a = (1..5);
 print "original list is  @a\n";  
 changefirst1 @a;
 print "chage1   list is  @a\n"; 

# OUTPUT
#original list is  1 2 3 4 5
#1 2 3 4 5
#1
#chage1   list is  99 2 3 4 5

 # Call it again
 @aaa = (1,2,3,4,5);
 print "second original list is  @aaa\n";  
 changefirst1 @aaa;
 print "second chage1   list is  @aaa\n"; 


#########################################################
#########################################################
 # Local variables are copies of the argument list

 sub changefirst2a{
    my @b = $ARG[0];
    $b[0] = 99;
 }
 sub changefirst2b{
    my @b = $ARG;
    $b[0] = 9999;
 }

 @a = (1..5);
 print "original list is  @a\n";

 changefirst2a @a;
 print "change2a   list is  @a\n";

 changefirst2b @a;
 print "change2b   list is  @a\n";

#original list is  1 2 3 4 5
#change2a   list is  1 2 3 4 5
#change2b   list is  1 2 3 4 5


#########################################################
#########################################################

 # Shows a pointer to a list
 sub changefirst3(\@){
    my $d = $ARG[0];
    print "IN changefirst3 @{$d}\n";
    ${$d}[0] = 777;
 }
 @a = (1..5);
 print "original list is  @a\n";
 changefirst3 @a;
 print "change3   list is  @a\n"; 
#original list is  1 2 3 4 5
#IN changefirst3 1 2 3 4 5
#change3   list is  777 2 3 4 5


#########################################################
#########################################################

 #Shows passing two lists as parameters

 sub twoparams1(\@\@){
    my ($d,$e) = @ARG;
    ${$d}[0] = 111;
    ${$e}[0] = 222;
 }

 @a = (1..5); @b = (6..9);
 print "original list is  @a@b\n"; 
 twoparams1 (@a,@b);
 print "twoparams1   list is  @a@b\n";  
#original list is  1 2 3 4 56 7 8 9
#twoparams1   list is  111 2 3 4 5222 7 8 9



#########################################################
#########################################################

 sub twoparams2(\@\@){
    my ($d,$e) = @ARG;
    my @f = @{$d};
    my @g = @{$e};
    print "IN params2 @f\n";
    print "IN params2 @g\n";
    $f[0] = 333;
    $g[0] = 444;
 }

 @a = (1..5); @b = (6..9);
 print "original list is  @a@b\n"; 
 twoparams2 (@a,@b);
 print "twoparams2   list is  @a@b\n";  
#original list is  1 2 3 4 56 7 8 9
#IN params2 1 2 3 4 5
#IN params2 6 7 8 9
#twoparams2   list is  1 2 3 4 56 7 8 9



#########################################################
#########################################################

sub params(\@\$\@){
   my ($a1, $x, $a2) = @ARG;

   print "@{$a1}\n";
   print "$$x\n";
   print "@{$a2}\n";
   print "$#{$a2}\n";
   $y = scalar @{$a2};
   print "$y\n";

}

@a = (1,2,3);
@b = (4,5,6, 7, 8);
$i = 99;

params(@a, $i, @b);
#1 2 3
#99
#4 5 6 7 8
#4
#5
