fri*_*edo 6 import perl lexical-scope
有时我需要一个有用的实用函数,就像List::Util::max在大型程序中间做很多事情一样.所以,如果我这样做
use List::Util 'max';
Run Code Online (Sandbox Code Playgroud)
在我的程序的顶部,我坚持使用该符号,污染我的整个命名空间,即使我只需要在一个子程序中.
所以我一直在考虑尝试不同的模式,而是:
use List::Util ();
# a whole bunch of stuff later...
sub blah {
List::Util->import( 'max' );
$blah = max @foobar;
...
}
Run Code Online (Sandbox Code Playgroud)
但是,这有两个问题.首先,它不会在块结束时自动不进行操作(drat.)我将不得不撤消所有内容unimport.
另一个问题是,显然原型没有得到正确应用,所以我不得不说,max( @foobar )而不是更漂亮的无括号版本.
是否有一种简单的方法来临时导入块的符号,这将自动使它们在块的末尾消失,哪些也可以正确处理原型?
您可以本地化符号表条目:
use List::Util ();
@y = qw(1 3 5 -9 4);
sub max { # return maximum *absolute value* of list
my $max = abs(shift);
$max<abs($_) && ($max=$abs($_)) for @_;
return $max;
}
sub max2 {
local *max = *List::Util::max;
return max(@_);
}
print "My max: ", max(@y), "\n"; # ==> 9
print "List::Util::max ", max2(@y), "\n"; # ==> 5
Run Code Online (Sandbox Code Playgroud)