从同一文件中定义的包导入符号

发布于 2025-01-10 11:07:08 字数 783 浏览 0 评论 0原文

我希望我可以做这样的事情:

p.pl

package Common;
use strict;
use warnings;
use experimental qw(signatures);
use Exporter qw(import);
our @EXPORT = qw(NA);
sub NA() { "NA" }


package Main;
use feature qw(say);
use strict;
use warnings;
use experimental qw(signatures);
Common->import();
say "Main: ", NA();
my $client = Client->new();
$client->run();


package Client;
use feature qw(say);
use strict;
use warnings;
use experimental qw(signatures);
Common->import();
sub run($self) {
    say "Client: ", NA();
}
sub new( $class, %args ) { bless \%args, $class }

在同一文件中的两个包之间共享公共符号。然而运行这个脚本会给出:

$ perl p.pl
Main: NA
Undefined subroutine &Client::NA called at ./p.pl line 30.

我在这里缺少什么?

I hoped I could do something like this:

p.pl :

package Common;
use strict;
use warnings;
use experimental qw(signatures);
use Exporter qw(import);
our @EXPORT = qw(NA);
sub NA() { "NA" }


package Main;
use feature qw(say);
use strict;
use warnings;
use experimental qw(signatures);
Common->import();
say "Main: ", NA();
my $client = Client->new();
$client->run();


package Client;
use feature qw(say);
use strict;
use warnings;
use experimental qw(signatures);
Common->import();
sub run($self) {
    say "Client: ", NA();
}
sub new( $class, %args ) { bless \%args, $class }

to share common symbols between two packages in the same file. However running this script gives:

$ perl p.pl
Main: NA
Undefined subroutine &Client::NA called at ./p.pl line 30.

What am I missing here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你在我安 2025-01-17 11:07:08

问题是您

$client->run();

之前

Common->import();

调用了A simple way to inline module:

BEGIN {
    package Common;
    use strict;
    use warnings;
    use experimental qw(signatures);
    use Exporter qw(import);
    our @EXPORT = qw(NA);
    sub NA() { "NA" }
    $INC{"Common.pm"} = 1;
}

然后您可以正常使用 use Common;

它并不完美。像 App::FatPacker 这样连接到 @INC 确实可以提供最佳结果。但这会让你的生活更轻松。

The problem is that you call

$client->run();

before

Common->import();

A simple way to inline modules:

BEGIN {
    package Common;
    use strict;
    use warnings;
    use experimental qw(signatures);
    use Exporter qw(import);
    our @EXPORT = qw(NA);
    sub NA() { "NA" }
    $INC{"Common.pm"} = 1;
}

Then you can use use Common; as normal.

It's not perfect. Hooking into @INC like App::FatPacker does provides the best results. But it will make your life easier.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文