#!/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 :