If I understand the OP’s question correctly, the programme’s structure is something like this:
#! perl
use strict;
use warnings;
for (qw(literal1 literal2 literal3))
{
print "$_\n";
foo('wilma');
}
sub foo
{
$_ = 'fred';
goto &bar;
}
sub bar
{
my ($name) = @_;
print "foo --> name = $name, \$_ = $_\n";
}
Unfortunately, changing the line $_ = 'fred'; to local $_ = 'fred'; doesn’t work: it does fix the syntax error, but within sub bar $_ is still literal1, literal2, and literal3 on successive iterations of the for loop. From the documentation for goto (underlining added):
The goto-&NAME form ... exits the current subroutine (losing any changes set by local()) and immediately calls in its place the named subroutine using the current value of @_.
The problem is that on each iteration of the for loop, global $_ is made an alias of the next item in the list. When that argument is a literal, this makes global $_ readonly, and that effect is undone only when that loop iteration completes. There doesn’t appear to be any way to undo this effect. :-(
|