Yes, @_ is always an alias for the actual variables that were passed to the function. It's generally bad to modify the caller's variables, but in some cases it gives a nice performance boost.
Since you're just learning this, you should also know that for-loops do the same thing, even if you declare the loop variable with 'my'. IMHO they should have made it so that 'for my' de-aliases the loop item, and a different syntax for the (more efficient) aliasing behavior. Perl didn't have an internal copy-on-write back then though, so this was probably done for efficiency even though it's a bit of a foot-gun.
sub modify_it {
$_[0]= 11;
}
my $x= 10;
for my $y ($x) {
modify_it($y);
}
say $x; // $x is now 11