【问题标题】:How can I get Perl to give a warning message when a certain package/tag is imported?导入某个包/标签时,如何让 Perl 发出警告消息?
【发布时间】:2010-09-16 07:06:56
【问题描述】:

我有一个我刚刚制作的包,我有一个“旧模式”,它基本上使它像以前一样工作:将所有内容导入当前命名空间。将其作为一个软件包的好处之一是我们不再需要这样做。无论如何,我想做的就是拥有它,以便无论何时有人这样做:

use Foo qw(:oldmode);

我发出警告说这已被弃用,他们应该只导入他们需要的东西,或者只使用 Foo->fun(); 访问函数

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

【问题讨论】:

    标签: perl import packages warnings


    【解决方案1】:

    您在package Foo 中编写自己的sub import,它将使用来自use Foo 的参数列表调用。

    一个例子:

    package Foo;
    use Exporter;
    
    sub import {
        warn "called with paramters '@_'";
    
        # do the real import work
        goto &{Exporter->can('import')};
    }
    

    所以在 subimport 中,您可以在参数列表中搜索已弃用的标签,然后抛出警告。

    更新:正如 Axeman 指出的那样,您应该致电 goto &{Exporter->can('import')}。这种形式的 goto 替换堆栈上的当前子例程调用,保留当前参数(如果有)。这是必需的,因为 Exporter 的 import() 方法将导出到其调用者的命名空间。

    【讨论】:

      【解决方案2】:

      好吧,正如您特别声明要在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' )};
      }
      

      感谢 Frew,他提到了 Perl 5.10 智能匹配语法。我正在学习在我的代码中使用 Perl 5.10 的所有方法。

      注意:在 import sub 中使用 exporter 的标准方法是操纵 $Exporter::ExportLevel 或调用 Foo-&gt;export_to_level( 1, @_ ); 但我喜欢上面的方式。它更快,我认为更简单。

      【讨论】:

      • 嗯,除了指定 if 语句之外,你确实做了同样的事情是 moritz,对吧?我的意思是,如果我把 if (@_ ~~ ':oldmode') {carp 'blah';} 放在他的里面,它会是一样的吗?
      猜你喜欢
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2015-08-07
      • 2013-04-15
      • 1970-01-01
      • 2019-09-12
      相关资源
      最近更新 更多