我有一个包,我只是做了,我有一个“旧模式”,基本上使它像以前的工作:导入一切到当前的名称空间。把它作为一个软件包的好处之一就是我们不必再那么做了。不管怎么说,我想做的是有它,这样每当有人做:如何在导入某个包/标记时让Perl给出警告消息?
use Foo qw(:oldmode);
我抛出一个警告,这是过时,与Foo-他们要么他们只需要进口什么或只是访问功能>有趣();
有关如何做到这一点的任何想法?
我有一个包,我只是做了,我有一个“旧模式”,基本上使它像以前的工作:导入一切到当前的名称空间。把它作为一个软件包的好处之一就是我们不必再那么做了。不管怎么说,我想做的是有它,这样每当有人做:如何在导入某个包/标记时让Perl给出警告消息?
use Foo qw(:oldmode);
我抛出一个警告,这是过时,与Foo-他们要么他们只需要进口什么或只是访问功能>有趣();
有关如何做到这一点的任何想法?
那么,你具体说明要在use Mod qw<:oldmode>;
的情况下报警这工作得更好:
package Foo;
use base qw<Exporter>;
use Carp qw<carp>;
...
sub import {
#if (grep { $_ eq ':oldmode' } @_) { # Perl 5.8
if (@_ ~~ ':oldmode') { # Perl 5.10
carp('import called with :oldmode!');
}
goto &{Exporter->can('import')};
}
感谢弗鲁,用于提Perl 5.10的智能匹配语法。我正在学习将Perl 5.10工作到我的代码中的所有方法。
注:在导入子使用出口的标准方法是要么操纵$Exporter::ExportLevel
或致电Foo->export_to_level(1, @_);
但我喜欢上面的方法。它更快,我认为更简单。
您可以自己编写sub import
于package Foo
,它将从use Foo
的参数列表中调用。
一个例子:
package Foo;
use Exporter;
sub import {
warn "called with paramters '@_'";
# do the real import work
goto &{Exporter->can('import')};
}
所以在子import
您可以搜索已过时的标签参数列表,然后抛出一个警告。
更新:正如Axeman指出的那样,您应该拨打goto &{Exporter->can('import')}
。这种形式的goto替换了堆栈上的当前子程序调用,保留了当前的参数(如果有的话)。这是必需的,因为Exporter的import()方法将导出到其调用者的名称空间。
那么你真的做了同样的事情是莫里茨除了指定if语句,对吧?我的意思是,如果我把(@_ ~~':oldmode'){carp'blah';}放在他的话,那将是同样的权利? – 2008-10-09 15:02:06