Try running this:
You'll notice it prints '2', while according to you it should print '5'.#!/usr/bin/perl use strict; my $a = 2; f($a); print "$a\n"; sub f { my $x = shift; $x = 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:
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.#!/usr/bin/perl use strict; my $a = 2; f(\$a); print "$a\n"; sub f { my $x = shift; $$x = 5; }
Hope this helps, -gjb-
In reply to Re: Re: Parameter passing
by gjb
in thread Parameter passing
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |