2008-10-09 15 views
6

我有一个包,我只是做了,我有一个“旧模式”,基本上使它像以前的工作:导入一切到当前的名称空间。把它作为一个软件包的好处之一就是我们不必再那么做了。不管怎么说,我想做的是有它,这样每当有人做:如何在导入某个包/标记时让Perl给出警告消息?

use Foo qw(:oldmode); 

我抛出一个警告,这是过时,与Foo-他们要么他们只需要进口什么或只是访问功能>有趣();

有关如何做到这一点的任何想法?

回答

11

那么,你具体说明要在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, @_);但我喜欢上面的方法。它更快,我认为更简单。

+0

那么你真的做了同样的事情是莫里茨除了指定if语句,对吧?我的意思是,如果我把(@_ ~~':oldmode'){carp'blah';}放在他的话,那将是同样的权利? – 2008-10-09 15:02:06

12

您可以自己编写sub importpackage 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()方法将导出到其调用者的名称空间。