Sample Perl lexical pragma
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
use 5.010; | |
use strict; | |
use warnings; | |
package Noise; | |
BEGIN { | |
# This trick prevents 'use Noise ...' from trying to find and load | |
# Noise.pm. | |
$INC{'Noise.pm'} = $0; | |
} | |
# The convention for naming %^H keys is "name-space/key-name". | |
use constant NOISE => join '/', __PACKAGE__, 'noise'; | |
# This gets called implicitly by 'use Noise ...' | |
sub import { | |
$^H{ +NOISE } = $_[1]; # $_[0] is the package name. | |
return; | |
} | |
sub noise { | |
my $hints_hash = ( caller 0 )[10]; | |
return $hints_hash->{ +NOISE }; | |
} | |
sub call_import { | |
my ( $invocant, @args ) = @_; | |
return $invocant->import( @args ); | |
} | |
package main; | |
use Noise 'The dog barks'; | |
say Noise->noise(); # The dog barks | |
{ | |
use Noise 'The cat meows'; | |
say Noise->noise(); # The cat meows | |
} | |
# The previous value is restored on scope exit | |
say Noise->noise(); # The dog barks | |
BEGIN { | |
Noise->import( 'The cow moos' ); | |
} | |
# A BEGIN block is good enough. No magic specific to 'use' | |
say Noise->noise(); # The cow moos | |
BEGIN { | |
{ | |
Noise->call_import( 'The giraffe says nothing' ); | |
} | |
} | |
# Scopes, or even call frames, in a BEGIN do not matter when setting %^H | |
say Noise->noise(); # The giraffe says nothing | |
# ex: set textwidth=72 : |
So THAT'S how that works! I've been Perling since 1997 and yet I still manage to find out new things. Thank you.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
That's just fantastic!