Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
使用import传递参数,但它会覆盖Perl中的导出_Perl - Fatal编程技术网

使用import传递参数,但它会覆盖Perl中的导出

使用import传递参数,但它会覆盖Perl中的导出,perl,Perl,我试图通过导入将参数传递到包中,但它会覆盖我的导出。我在Debugger.pm中看到一些建议的$main:debugLevel,但它不起作用。如何解决这个问题 main.pl our $debugLevel = 5; our $dDebug=TRUE; our $dPkg=__PACKAGE__; our $dMsg=""; use MyPkg::Debugger qw( :all ); # ^-- how do I pass in the variables declared above

我试图通过导入将参数传递到包中,但它会覆盖我的导出。我在Debugger.pm中看到一些建议的$main:debugLevel,但它不起作用。如何解决这个问题

main.pl

our $debugLevel = 5;  
our $dDebug=TRUE;
our $dPkg=__PACKAGE__;
our $dMsg="";

use MyPkg::Debugger qw( :all );
# ^-- how do I pass in the variables declared above?
...

dPrintLog(4, 'testsub', 'msg', $mydata);
# ^-- this generate error, if i put in the "import" sub in the Debugger.pm
下午六时

use strict;
package MyPkg::Debugger;

our $VERSION     = 1.00;
our @ISA         = qw(Exporter);
our @EXPORT_OK   = qw(dPrintLog );
our %EXPORT_TAGS = (
                     all => \@EXPORT_OK
                   );

use DateTime::Format::Strptime;
use POSIX qw(strftime);
use Data::Dumper;

our $debugLevel = 5;  
our $dDebug=TRUE;
our $dPkg=__PACKAGE__;
our $dMsg="";

sub import {
   my ($debugLevel , $dDebug, $dMsg, $data) = @_;
}

sub dPrintLog {
     my ($level, $sub, $msg, $data) = @_;
     if ($level == 5) {
          print "L:" . $level . ";" . "Pkg:" . $sub . ";". "Msg: " . $msg . "\n";
          print '   '.Dumper($data) unless (!defined $data);   
     }elsif ($level == 3){
     }elsif ($level == 1){
     }else{
     }
}
仔细阅读客户的文档。它包含您需要的所有信息

App.pl

#!/usr/bin/perl
use warnings;
use strict;

use MyDbg (':all', 5); # Try removing the 5.

dPrintLog(undef, 'message');
MyDbg.pm

package MyDbg;
use warnings;
use strict;


our @ISA         = qw(Exporter);
our @EXPORT_OK   = qw(dPrintLog );
our %EXPORT_TAGS = ( all => \@EXPORT_OK );
use Exporter ();

my $debugLevel = 3;  

sub import {
    my ($class, $tag, $level) = @_;
    $debugLevel = $level if $level;
    $class->Exporter::export_to_level(1, $class, $tag);
}

sub dPrintLog {
    my ($level, $msg) = @_;
    $level ||= $debugLevel;
    print { 5 => "L:$level $msg",
            3 => "$msg",
            1 => substr $msg, 0 ,1,
          }->{$level}, "\n";
}

__PACKAGE__
有趣的是,如果删除@ISA行,它将不起作用。您必须声明导出子例程才能使其工作(根据我的实验,未找到任何文档):

甚至

sub export { goto &Exporter::export }

我运行它时出错。另一方面,未定义的子例程&main::dPrintLog,1。我注意到您确实打印了{…}->{$level},下面的“->{$level}是用于什么的?2.底部的“PACKAGE”是用于什么的?@hidden:Perl和Exporter的哪个版本?
->{level}
从匿名散列中获取值,如开关。
\u包
返回真实值,如
1;
返回。这是perl 5,版本14,subversion 2(v5.14.2)为MSWin32-x86-multi-thread构建。我不知道如何检查导出程序版本。@隐藏:
use
在编译时运行,$dLevel可能仍然为空-您必须在BEGIN块中填充它。
*export = *Exporter::export{CODE};
sub export { goto &Exporter::export }