Another related point is that it's important to use the two constructs under discussion, rather than working on @_ directly (unless that's what you want). @_ is passed in by referecne, most of the time, we work on local copies within the sub.
use strict;
my $a = 1;
change($a);
print "a is now: $a\n";
not_change($a);
print "a is now: $a\n";
sub change{
++$_[0];
}
sub not_change{
my $b = shift;
++$b;
}
__OUTPUT__
a is now: 2
a is now: 2