有时我需要一个有用的实用程序函数,比如List::Util::max
在大型程序中间执行很多操作。所以如果我这样做
use List::Util 'max';
在我的程序的顶部,我坚持使用该符号,污染我的整个命名空间,即使我只需要在一个子例程中。
所以我一直在考虑尝试不同的模式,而不是:
use List::Util ();
# a whole bunch of stuff later...
sub blah {
List::Util->import( 'max' );
$blah = max @foobar;
...
}
但是有两个问题。首先,它不会在块结束时自动取消导入(drat。)我将不得不用unimport
撤消所有内容。
另一个问题是显然原型没有得到正确应用,所以我不得不说max( @foobar )
而不是更漂亮的无括号版本。
是否有一种简单的方法可以临时导入块的符号,这会自动使它们在块的末尾消失,哪些还正确处理原型?
答案 0 :(得分:4)
这样做,它更好更清洁:
package Foo;
use strict; use warnings;
use List::Util 'max';
use namespace::autoclean;
# your method definitions here...
在程序包的编译周期完成后, namespace::autoclean将“取消导入”符号。在您的方法中对它的调用仍然有效,但您没有名称空间污染(*Foo::max
符号被删除)并且调用$obj->max()
将失败。
或者,您可能想看一下Lexical::Import(我对此一无所知;一只小鸟提到它)。
答案 1 :(得分:2)
如果你只在一个子程序中使用max,我根本不会将它导入命名空间。我的解决方案是
use List::Util;
sub blah {
print List::Util::max(@list);
}
答案 2 :(得分:1)
您可以本地化符号表条目:
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
答案 3 :(得分:1)
perlfunc暗示no MODULE
应该做你想做的事:
sub blah {
use List::Util qw(max);
say max @foobar;
no List::Util;
}
但这不起作用 - 至少不适用于List :: Util。我认为需要定义unimport
方法。即使这样,我也不确定你的模块中是否可以使用max
来调用不同的定义。