in reply to Subroutines: @_ and shift

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