in reply to Parameter passing

Why pass references in - why not just pass the scalars $x and $y?
my ($x, $y); if (fn($x, $y)) { die "fn() failed\n"; } # do stuff with $x and $y... exit 0; sub fn { my ($fn_x, $fn_y) = @_; ($fn_x, $fn_y) = ('x', 'y'); my $rc = 0; $rc = 1 if $fn_x ne 'x'; # never happens, just an example return 0; }
The only change I made was to change the call - instead of passing references in, just pass the scalars. You aren't changing the values of the variables in the subroutine - I can't see any reason why you would want to pass the references instead of the actual scalar values.

Replies are listed 'Best First'.
Re: Re: Parameter passing
by gjb (Vicar) on Oct 30, 2003 at 16:11 UTC

    Try running this:

    #!/usr/bin/perl use strict; my $a = 2; f($a); print "$a\n"; sub f { my $x = shift; $x = 5; }
    You'll notice it prints '2', while according to you it should print '5'.

    This is precisely why a reference should be passed to the function. If you don't, you actually pass a value (2) and initialize the local variable $x to it. Later in the sub the value of $x is change to 5. Now why should that change the value of $a in the main program? It shouldn't since the subroutine only knows about the value of $a which happens to be 2, not about $a itself so the value of $a will remain 2 as it was before the function call.

    Changing the code above to:

    #!/usr/bin/perl use strict; my $a = 2; f(\$a); print "$a\n"; sub f { my $x = shift; $$x = 5; }
    will actually print '5' rather than '2'. Now you pass the address of the variable $a to the sub and it gets stored in $x. The value at the address in $x is set to 5 by dereferencing $x with $$x. Since $x is the address of $a, it's value is indeed changed to 5.

    Hope this helps, -gjb-