当前位置:  开发笔记 > 编程语言 > 正文

如何在导入某个包/标签时让Perl发出警告消息?

如何解决《如何在导入某个包/标签时让Perl发出警告消息?》经验,为你挑选了2个好方法。

我有一个我刚刚创建的包,我有一个"旧模式",它基本上使它像以前一样工作:将所有内容导入当前命名空间.将此作为一个包的一个好处是我们不再需要这样做.无论如何,我想做的就是拥有它,以便每当有人这样做时:

use Foo qw(:oldmode);

我抛出一个警告,这是不推荐使用的,他们应该只导入他们需要的东西,或者只使用Foo-> fun()访问函数;

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



1> moritz..:

你编写自己sub importpackage Foo,将使用参数列表调用use Foo.

一个例子:

package Foo;
use Exporter;

sub import {
    warn "called with paramters '@_'";

    # do the real import work
    goto &{Exporter->can('import')};
}

因此,在sub中,import您可以在参数列表中搜索已弃用的标记,然后发出警告.

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



2> Axeman..:

好吧,正如你明确指出你想在这种情况下报警use Mod qw<:oldmode>;更好:

package Foo;
use base qw;
use Carp qw;
...
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用于我的代码的所有方法.

注意:在导入子中使用导出器的标准方法是操作$Exporter::ExportLevel或调用Foo->export_to_level( 1, @_ );但是我喜欢上面的方法.它更快,我认为更简单.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有