in reply to shift vs @_

To put it one way, they are always using @_. If you don't give an array to shift, it uses @_.

I think the "shift" idiom caught on out of laziness, though it's not as slick with more than one argument. You can write:

my $var1 = shift; my $var2 = shift;...
Likewise, you can write:
my ($var)=@_;
for only one argument.

Hays