Yes, you're accessing the same
$_ everywhere. So, by definition, it's a global.
Only, it temporarily gets a new value before the call to your sub, and it gets restored to its old value afterwards.
One way to that yourself is by using
local $_;
or
local $_ = 'temporary value';
which makes a copy of your value; or, as
ikegami wrote in another reply, using
for/foreach:
foreach('temporary value') {
# your code
}
which will loop exactly
once, with
$_ set to an alias of the value (meaning it's a different name for the same value, change the variable and the value will follow (or, for a constant, it might protest against the attempt to change a read-only value).