On Sunday 16 January 2011, Ralf Wildenhues wrote: > On the AIX 5.1 I test on, perl 5.0.8 fails over a recent Options.pm > change: > > $ ./tests/automake-1.11a --help > Can't use global $_ in "my" at > /tmp/build-powerpc-ibm-aix5.2.0.0/../automake/lib/Automake/Options.pm line > 263, near "my $_ " > Compilation failed in require at /tmp/build-powerpc-ibm-aix5.2.0.0/automake > line 154. > BEGIN failed--compilation aborted at > /tmp/build-powerpc-ibm-aix5.2.0.0/automake line 154. > > Now, perldoc perlvar documents: > As $_ is a global variable, this may lead in some cases to unwanted > side-effects. As of perl 5.9.1, you can now use a lexical version of $_ by > declaring it in a file or in a block with "my". Moreover, declaring "our > $_" > restores the global $_ in the current scope. > > I'm currently using the patch below (not tested yet), but you might > prefer something safer? Otherwise, OK? > > Thanks, > Ralf > > Avoid local $_ perl variable, for Perl before 5.9.1. > > * lib/Automake/Options.pm (_process_option_list): Do not > lexically localize $_. Fixes bootstrap on AIX 5.1. > > diff --git a/lib/Automake/Options.pm b/lib/Automake/Options.pm > index 31052c0..a1dfcde 100644 > --- a/lib/Automake/Options.pm > +++ b/lib/Automake/Options.pm > @@ -260,7 +260,7 @@ sub _process_option_list (\%@) > > foreach my $h (@list) > { > - my $_ = $h->{'option'}; > Oops, this was a *bad* mistake of mine. Ironically, I'm fully aware that "my $_" is royally unportable (I used perl 5.8.10 until a few months ago, and "my $_" don't work with it!), so I guess the above slipped in only through a botched edit (which, BTW, is not an excuse for such a mess-up). I can only apologize about such a stupid, stupid mistake.
> + $_ = $h->{'option'}; > What about using a "good ol' local" here? E.g.: local $_ = $h->{'option'}; That should be portable to any perl 5.x, and a bit safer. BTW, I'd also add to the ChangeLog entry the "git describe" output for the commit where I messed things up (if I'm not mistaken, it should be `v1.11-622-gf90a06c'). For example: options: avoid local $_ perl variable, for Perl before 5.9.1. * lib/Automake/Options.pm (_process_option_list): Do not lexically localize $_. Fixes bootstrap on AIX 5.1. Bug introduced in commit `v1.11-622-gf90a06c'. > my $where = $h->{'where'}; > $options->{$_} = $where; > if ($_ eq 'gnits' || $_ eq 'gnu' || $_ eq 'foreign') > > Thanks for the patch, and sorry for the botch-up. Stefano