package Importer; sub import { shift; for (@_) { if (/^([\$@&%]?)(?:\w+::)*(\w+)$/) { ($sigil, $name) = ($1, $2); $var = $sigil ? "\\$_" : "*$_"; eval "*" . caller() . "::$name = $var"; die $@ if $@; } else { die "Can't import $_" } } } 1; # Example use strict; use warnings; use Importer qw($MyPackage::var); # Pretend you have a module/package "MyPackage" that # contains a package variable "var" $MyPackage::var = 5; print "$var\n"; # Update: Alternate version which avoids string eval package Importer; my %sig = ( '$' => sub { *{"$_[0]::$_[1]"} = \${$_[2]} }, '@' => sub { *{"$_[0]::$_[1]"} = \@{$_[2]} }, '%' => sub { *{"$_[0]::$_[1]"} = \%{$_[2]} }, '&' => sub { *{"$_[0]::$_[1]"} = \&{$_[2]} }, '*' => sub { *{"$_[0]::$_[1]"} = *{$_[2]} }, ); # Yet another update: Or maybe you like this better: my %sig = map { $_ => eval sprintf 'sub { *{"$_[0]::$_[1]"} = %s{$_[2]} }', ($_ eq "*") ? $_ : "\\$_" } qw($ @ % & *); sub import { shift; for (@_) { if (/^([\$@&%*]?)((?:\w+::)*(\w+))$/) { ($sigil, $name, $base) = ($1 || "*", $2, $3); $sig{$sigil}->(scalar(caller), $base, $name); } else { die "Can't import $_\n" } } } 1;