Magically Banishing $_
This curiously exotic underscore tie
class[152] is used to outlaw unlocalized uses of $_. Instead of pulling in the module with
use, which invokes the class’s
import method, this module should be loaded with no to call the
seldom-used unimport method (see Chapter 11). The user
says:
no underscore;
And then all uses of $_ as
an unlocalized global raise an exception.
Here’s a little test suite for the module:
#!/usr/bin/perl
no underscore;
@tests = (
"Assignment" => sub { $_ = "Bad" },
"Reading" => sub { print },
"Matching" => sub { $x = /badness/ },
"Chop" => sub { chop },
"Filetest" => sub { –x },
"Nesting" => sub { for (1..3) { print } },
);
while ( ($name, $code) = splice(@tests, 0, 2) ) {
print "Testing $name: ";
eval { &$code };
print $@ ? "detected" : " missed!";
print "\n";
}which prints out the following:
Testing Assignment: detected Testing Reading: detected Testing Matching: detected Testing Chop: detected Testing Filetest: detected Testing Nesting: 123 missed!
The last one was “missed” because it was properly localized by
the for loop and thus safe to
access.
Here’s the curiously exotic underscore module itself. (Did we mention
that it’s curiously exotic?) It works because tied magic is
effectively hidden by a local.
The module does the tie in its
own initialization code so that a require also works:
package underscore; use warnings; use strict; use Carp (); our $VERSION = sprintf "%d.%02d", q$Revision: 0.1 $ =~ /(\d+)/g; sub TIESCALAR{ my ($pkg, $code, ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access