gpt4 book ai didi

perl - perl 导入子例程有什么特别之处?

转载 作者:行者123 更新时间:2023-12-01 04:55:51 24 4
gpt4 key购买 nike

我花了两个小时才找到这个错误。我可以解决它,但我不明白。

如果我有一个 perl 模块 ./lib/My/Foo.pm看起来像这样:

package My::Foo;

sub import {print "importing\n"}

1;

然后使用它调用 import子程序隐含:
$ PERL5LIB=./lib perl -MMy::Foo -e 'print "ok\n"'
importing
ok

但是如果我复制相同的模块并在没有冒号的情况下使用它, import子程序是 不是 叫。
$ cp lib/My/Foo.pm lib/Foo.pm
$ PERL5LIB=./lib perl -MFoo -e 'print "ok\n"'
ok

如果我改变 importdo_import 之类的其他内容,不调用子程序。所以我可以避免这种行为。但在我的实际用例中,我有一个 Import类和抽象方法 import ,然后在子类中实现该方法。所以我不想要这个 import use 时自动调用的方法荷兰国际集团的父类。

我查看了 perlootutperlobj并没有看到任何提及这一点。

最佳答案

import()是 Perl 中的特殊方法名。每当你 use一个模块,Perl 会寻找一个名为 import() 的子程序。在该模块内,如果找到它,它将运行。

这最常用于 Exporter聪明。这意味着有一个名为 import() 的方法在您的模块中,您不想在加载模块时被调用是 非常糟糕的主意 .它会让你每时每刻都在与 Perl 对抗。

perldoc -f import有关更多信息的指针:

import LIST

There is no builtin import function. It is just an ordinary method (subroutine) defined (or inherited) by modules that wish to export names to another module. The use function calls the import method for the package used. See also use, perlmod, and Exporter.



您找到的“解决方法”也不是一个好主意。您实际上是从一个名为 Foo.pm 的文件中加载一个名为 My:Foo 的模块,如果文件名和包名不匹配,Perl 会感到非常困惑。

关于perl - perl 导入子例程有什么特别之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47096734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com