Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Perl在导入某个包/标记时发出警告消息?_Perl_Import_Packages_Warnings - Fatal编程技术网

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

如何让Perl在导入某个包/标记时发出警告消息?,perl,import,packages,warnings,Perl,Import,Packages,Warnings,我有一个我刚刚制作的包,我有一个“旧模式”,基本上使它像以前一样工作:将所有内容导入当前名称空间。把它作为一个包的好处之一是我们不再需要这样做。无论如何,我想做的是,无论何时,只要有人这样做: use Foo qw(:oldmode); 我抛出一个警告,这是不推荐的,他们应该要么只导入他们需要的,要么只使用Foo->fun()访问函数 有什么想法吗?您可以在包Foo中编写自己的子导入,通过使用Foo中的参数列表调用它 例如: package Foo; use Exporter; sub im

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

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


有什么想法吗?

您可以在
包Foo
中编写自己的
子导入
,通过
使用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()方法将导出到其调用者的命名空间。

好吧,因为您特别声明在
使用Mod qw这更有效:

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' )};
}
package-Foo;
使用基本qw;
使用鲤鱼qw;
...
次级进口{
#如果(grep{$\ueq':oldmode'}@{#Perl 5.8
如果(@~~':oldmode'){#Perl 5.10
carp('import-called with:oldmode!');
}
转到&{Exporter->can('import')};
}
感谢Frew提到Perl5.10智能匹配语法。我正在学习将Perl5.10应用到代码中的所有方法


注意:在导入子系统中使用导出器的标准方法是操作
$exporter::ExportLevel
或调用
Foo->export\u到\u级别(1,@)
但我喜欢上面的方式。它更快,我认为更简单。

你确实做了同样的事情,就是莫里茨,只指定了if语句,对吗?我的意思是,如果我在他的if(@~~~':oldmode'){carp'blah';}中加入if,也会是一样的,对吗?