> i haven't run it but i already see conflicts with nested $_.
It's not obvious that the $_ nesting is a problem. The point should be moot
because the C<while> loop *should* localize $_. It doesn't. Well, it does,
but there's a loophole.
Quoting pg 18 of the 3rd Edition Camel (emphasis added):
[...]
while (<STDIN>) { print; } # the shortest way
[...]
When you're implicitly assigning to $_ in a $_ loop, this is the
*global* variable by that name, not the one localized to the while
loop.
It continues,
You can protect an existing value of $_ this way:
while (local $_ = <STDIN>) { print; } # use local $_
This use of the *global* $_ along with Rafael's description of constants in
a C<..> gives this error line:
Modification of a read-only value attempted at peter_scott.pl line
Here's a modified version that exercises the bug or eliminates it...
#! /usr/bin/perl
use warnings;
use diagnostics;
my $exercise_bug = 1; # Set 'true' to show the bug.
for (1..2) {
print_file($0);
}
for (qw(one two)) {
print_file($0);
}
sub print_file {
local @ARGV = shift;
if ($exercise_bug) {
# Modification of a read-only value attempted at peter_scott.pl line
20
while (<>) { print }
}
else {
while (local $_ = <>) { print }
}
}