Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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 Can';我不能正确使用出口商_Perl_Exporter - Fatal编程技术网

Perl Can';我不能正确使用出口商

Perl Can';我不能正确使用出口商,perl,exporter,Perl,Exporter,我已经在一个更大的代码块上浪费了很多天,其中包含Exporter语句,大约在一年前就可以使用了。这方面的几个变体都失败了,包括安装了表示成功的/FOO/BAR/Foobar.pm 我使用的是Windows10,PerlV5.26.0,它是为MSWin32-x64多线程构建的 Caller.pl #/usr/bin/perl 使用lib“.”; 使用lib“/FOO/BAR”; 严格使用; 使用警告; 使用FOO::BAR::Foobar; 打印“try FOO::BAR::Foobar::FOO

我已经在一个更大的代码块上浪费了很多天,其中包含
Exporter
语句,大约在一年前就可以使用了。这方面的几个变体都失败了,包括安装了表示成功的
/FOO/BAR/Foobar.pm

我使用的是Windows10,PerlV5.26.0,它是为MSWin32-x64多线程构建的

Caller.pl
#/usr/bin/perl
使用lib“.”;
使用lib“/FOO/BAR”;
严格使用;
使用警告;
使用FOO::BAR::Foobar;
打印“try FOO::BAR::Foobar::FOO()\n”;
FOO::BAR::Foobar::FOO();#perl找不到这个
打印“try foo()\n”;
foo();#出错-找不到&main::foo
打印“完成”\n;
/FOO/BAR/Foobar.pl
#/usr/bin/perl-w
严格使用;
使用警告;
包装Foobar;
我们的($VERSION,@ISA,@EXPORT,@EXPORT\u OK,%EXPORT\u TAGS,$FOO);
开始{
要求出口商;
@ISA=qw(出口商);
@出口_OK=qw(foo);
}
sub-foo{
打印“已加载\n”;
$FOO=q{some val};
}
1.
执行转储
perl Caller.pl
试试FOO::BAR::Foobar::FOO()
在Caller.pl第12行调用了未定义的子例程&FOO::BAR::Foobar::FOO。

发生什么事了?我应该放弃使用导出器吗?但是如何跨模块链接功能呢?

有三件事出了问题:

  • 对于
    FOO::BAR::Foobar::FOO()
    :没有这样的
    子项
    ,只有
    Foobar::FOO()

  • 使用
    foo()
    使用foo::BAR::Foobar
    相当于
    BEGIN{require FOO::BAR::Foobar;FOO::BAR::Foobar->import()}
    ,但是在包
    FOO::BAR::Foobar
    中没有方法
    import
    ,因为您将
    Exporter
    继承到包
    Foobar

  • 使用
    foo()
    :您正在使用
    @EXPORT\u OK
    而不是
    @EXPORT
    ,这意味着您需要显式导入
    foo
    ,但在
    使用foo::BAR::Foobar中没有这样做

  • 因此,需要两件事来解决这个问题:

  • 正如@HåkonHægland在评论中指出的,更改
    包装Foobar
    包FOO::BAR::Foobar

  • 更改
    使用FOO::BAR::Foobar使用FOO::BAR::Foobar qw/FOO/

  • 然后,您展示的代码将起作用-没有必要放弃。我建议您使用另一种风格的
    Exporter
    :不要通过
    @ISA
    继承,只需将
    import
    导入到您的包中即可。下面是我将如何编写您的文件
    /FOO/BAR/Foobar.pm

    package FOO::BAR::Foobar;
    use strict;
    use warnings;
    
    use Exporter 'import';
    our @EXPORT_OK = qw(foo);
    
    our $FOO;
    sub foo {
        print "Loaded\n";
        $FOO = q{some val};
    }
    
    1;
    

    有三件事出了问题:

  • 对于
    FOO::BAR::Foobar::FOO()
    :没有这样的
    子项
    ,只有
    Foobar::FOO()

  • 使用
    foo()
    使用foo::BAR::Foobar
    相当于
    BEGIN{require FOO::BAR::Foobar;FOO::BAR::Foobar->import()}
    ,但是在包
    FOO::BAR::Foobar
    中没有方法
    import
    ,因为您将
    Exporter
    继承到包
    Foobar

  • 使用
    foo()
    :您正在使用
    @EXPORT\u OK
    而不是
    @EXPORT
    ,这意味着您需要显式导入
    foo
    ,但在
    使用foo::BAR::Foobar中没有这样做

  • 因此,需要两件事来解决这个问题:

  • 正如@HåkonHægland在评论中指出的,更改
    包装Foobar
    包FOO::BAR::Foobar

  • 更改
    使用FOO::BAR::Foobar使用FOO::BAR::Foobar qw/FOO/

  • 然后,您展示的代码将起作用-没有必要放弃。我建议您使用另一种风格的
    Exporter
    :不要通过
    @ISA
    继承,只需将
    import
    导入到您的包中即可。下面是我将如何编写您的文件
    /FOO/BAR/Foobar.pm

    package FOO::BAR::Foobar;
    use strict;
    use warnings;
    
    use Exporter 'import';
    our @EXPORT_OK = qw(foo);
    
    our $FOO;
    sub foo {
        print "Loaded\n";
        $FOO = q{some val};
    }
    
    1;
    

    尝试在文件
    /FOO/BAR/Foobar.pl
    的顶部用
    package FOO::BAR::Foobar
    替换
    package Foobar
    。值得指出的是,模块文件通常不会运行,因此shebang行
    #/usr/bin/perl-w
    只是一个注释,应该删除。“我在一个更大的代码块上浪费了很多天,其中包含导出器语句,大约在一年前就可以使用了。”试图将这些东西归咎于perl中的一个bug并不是很合适,这比您犯错误的可能性要小得多。如果您没有更改“较大的代码块”,它仍然会运行,这是您应该在“许多天”之前尝试的第一件事情之一。提示:
    是CWD,而不是脚本的目录。由于您需要脚本的目录,请改用
    $RealBin
    (在执行
    之后使用FindBin qw($RealBin);
    )。e、 g.
    使用FindBin qw($RealBin);使用lib$RealBin“$RealBin/FOO/BAR”
    尝试将
    package Foobar
    替换为
    package FOO::BAR::Foobar
    文件
    /FOO/BAR/Foobar.pl
    值得指出的是,模块文件通常不会运行,因此shebang行
    #/usr/bin/perl-w
    只是一个注释,应该删除。“我在一个更大的代码块上浪费了很多天,其中包含导出器语句,大约在一年前就可以使用了。”试图将这些东西归咎于perl中的一个bug并不是很合适,这比您犯错误的可能性要小得多。如果您没有更改“较大的代码块”,它仍然会运行,这是您应该在“许多天”之前尝试的第一件事情之一。提示:
    是CWD,而不是脚本的目录。由于您需要脚本的目录,请改用
    $RealBin
    (在执行
    之后使用FindBin qw($RealBin);
    )。e、 g.
    使用FindBin qw($RealBin);使用lib$RealBin“$RealBin/FOO/BAR”1。和