gpt4 book ai didi

perl - 这个对 Perl 模块中的子例程的调用是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 03:13:21 25 4
gpt4 key购买 nike

我最近看到一些让我感到困惑的 Perl 代码。我取出了所有额外的部分来看看它是如何工作的,但我仍然不明白它为什么会起作用。

基本上,我创建了这个虚拟“模块”(TTT.pm):

use strict;
use warnings;

package TTT;
sub new {
my $class = shift;
return bless {'Test' => 'Test'}, $class;
}

sub acquire {
my $tt = new TTT();
return $tt;
}
1;

然后我创建了这个脚本来使用模块(ttt.pl):
#!/usr/bin/perl
use strict;
use warnings;

use TTT;
our $VERSION = 1;

my $tt = acquire TTT;
print $tt->{Test};

让我感到困惑,我认为行不通的线是:
my $tt = acquire TTT;

我认为它不会起作用,因为“获取”子从未导出。但它确实有效。
在调用获取后,我对“TTT”感到困惑,所以我删除了它,留下这样的行:
my $tt = acquire;

它提示一句空话,就像我想的那样。我添加了括号,如下所示:
my $tt = acquire();

它提示说没有 main::acquire ,就像我想的那样。

我习惯了对象可用的子例程,或导出的子例程,但我从未见过以包名结尾的子例程被调用。我什至不知道如何在谷歌上搜索这个。

所以我的问题是,在子例程调用之后添加包名如何工作?我以前从未见过这样的事情,这可能不是一个好的做法,但是有人可以解释一下 Perl 正在做什么吗?

谢谢!

最佳答案

您正在使用 Perl 允许的间接对象语法(但在现代代码中不鼓励使用)。基本上,如果一个名称没有预先声明,它可以放在一个对象(或类名)前面,用空格分隔。

所以行 acquire TTT实际上意味着 TTT->acquire .如果您实际上有一个名为 acquire 的子程序在范围内,它将被解释为 aquire(TTT)这可能会导致歧义(因此不鼓励这样做)。

您还应该更新 new TTT();读取方法中的行 TTT->new;

关于perl - 这个对 Perl 模块中的子例程的调用是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5597428/

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