my $x = 33;
print qq{\$x before the sub call is $x\n};
test_it($x);
print qq{\$x after the sub call is $x\n};
sub test_it {
my $x = shift;
print qq{The value of \$x passed in was $x\n};
$x = 99;
print qq{The sub has now modified \$x to be $x\n};
}
This will lead to
$x before the sub call is 33 The value of $x passed in was 33 The sub has now modified $x to be 99 $x after the sub call is 33Note that the variable $x declared within the subroutine has scope only within that routine, and so altering the value within the subroutine doesn't affect the variable $x in the main program.
However, as we shall see later, often for convenience (and also memory considerations) one passes in references to variables. Consider doing so in the above example:
my $x = 33;
print qq{\$x before the sub call is $x\n};
test_it(\$x);
print qq{\$x after the sub call is $x\n};
sub test_it {
my $xref = shift;
print qq{The value of \$xref passed in was $$xref\n};
$$xref = 99;
print qq{The sub has now modified \$xref to be $$xref\n};
}
which will lead to the following:
$x before the sub call is 33 The value of $xref passed in was 33 The sub has now modified $xref to be 99 $x after the sub call is 99Thus, passing in a variable by reference into a subroutine, and subsequently altering it's value, will alter the values of the corresponding variables in the calling program.