in reply to Re: How to safely use $_ in a library function?
in thread How to safely use $_ in a library function?
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. :-(
| Athanasius <°(((>< contra mundum | Iustus alius egestas vitae, eros Piratica, |
|
|---|