sub upack_with_shift { my $foo = shift; my $bar = shift; my $baz = shift; .... DO STUFF ... } sub list_assignment { my ( $foo, $bar, $baz ) = @_; } sub direct_access { $_[0] = "PROCESSED"; $_[1] += $_[2]; $_[2] = undef; return 1; } # direct access is dangerous. Perl passes sub arguments by reference. # it is possible to change values in a calling function's variables if you aren't careful. my use_da { my @foo = ('', 5, 7); my $result = direct_access( @foo ); print join ', ', $result, @foo; # prints: 1, PROCESSED, # generates a warning if warnings on. "Use of uninitialized value in join at line mumble" }