[comp.lang.perl] Asymmetry between array and scalar call by reference.

roger@gtisqr.uucp (Roger Droz) (02/15/91)

I prefer to code my subroutines with
	local($foo, $bar) = @_
so that I can use more meaningful name than @_[2] in the subroutine
body.  Since local converts scalars arguments to call by value, I
make extensive use of  *name.  One day, I managed to call a subroutine
that reused variable names as shown in the contrived example below. 
Note the asymmetry in the treatment of scalars and arrays!

$foo = 'callers foo';
$bar = 'callers bar';
$fooey[0] = 'callers array';
$barey[0] = 'callers other array';

printf "%s: foo=%s, bar=%s\n", 'main', $foo, $bar;
printf "%s: fooey[0]=%s, barey[0]=%s\n", 'main', $fooey[0], $barey[0];
&mysub(*foo, *fooey);
printf "%s: foo=%s, bar=%s\n", 'main', $foo, $bar;
printf "%s: fooey[0]=%s, barey[0]=%s\n", 'main', $fooey[0], $barey[0];


sub mysub {
    local(*bar, *barey) = @_;
    local($foo) = 'subs foo';
    local(@fooey) = ('subs array');

    printf "%s: foo=%s, bar=%s\n", 'mysub', $foo, $bar;
    printf "%s: fooey[0]=%s, barey[0]=%s\n", 'mysub', $fooey[0], $barey[0];
    $bar = 'sub returns something by reference';
    $barey[0] = 'sub modifies array';
}

main: foo=callers foo, bar=callers bar
main: fooey[0]=callers array, barey[0]=callers other array
mysub: foo=subs foo, bar=subs foo                  <-- why!?
mysub: fooey[0]=subs array, barey[0]=callers array <-- as expected.
main: foo=callers foo, bar=callers bar             <-- value wasn't returned.
main: fooey[0]=sub modifies array, barey[0]=callers other array <-- expected.

____________
               Roger Droz       
()       ()    Maverick MICRoSystems / Global Technology International
 (_______)     Mukilteo, WA 
  (     )      
   |   |       Disclaimer: "We're all mavericks here: 
   |   |                    Each of us has our own opinions,
   (___)                    and the company has yet different ones!"

Internet: roger@mav.COM     UUCP: uw-beaver!gtisqr!roger