没有括号的Perl方法调用

5

我的一个项目包含许多简单的方法调用。为了避免混乱,使频繁修改更容易,我希望能够不使用括号来调用它们。

我进行了以下测试。

带括号的调用 (显然可以工作):

my $something = [1, 2, 3];

my $dumper = Data::Dumper->new([$something]);

$dumper->Indent(0);

say $dumper->Dump();

现在不需要括号了(仅适用于没有参数的方法)。
my $something = [1, 2, 3];

# my $dumper = Data::Dumper->new [$something];  # syntax error
my $dumper = Data::Dumper->new([$something]);

# $dumper->Indent 0; # Number found where operator expected
$dumper->Indent(0);

say $dumper->Dump;  # works!

我还测试了间接语法。我知道它存在的问题,但如果它可以正常工作,那么这可能是一个选项。但事实并非如此。

sub say2 { say @_; return; }

my $something = [1, 2, 3];

my $dumper = new Data::Dumper [$something]; # works!

# Indent $dumper, 0; # No error, but doesn't do what supposed to happen
Indent $dumper(0); # works

# say Dump $dumper;  # say() on unopened filehandle Dump
say2 Dump $dumper;  # works

有没有一种方法可以在不使用括号的情况下持续地调用方法?我不明白为什么Perl不允许这样做,因为似乎并不存在任何歧义。对于子例程,我们有“use subs”,也许方法也存在类似的方式?
为了完整起见,在上面的示例中,是否有一种避免使用'say2'子例程但仍无需使用括号调用的方法?
也许有某种骗局或诀窍可行?
1个回答

5
我想我们在这里讨论的是原型 - 你可以为子程序指定一个原型,它显示了它所期望的参数和类型。如果你不指定原型,Perl必须猜测参数的类型以及如何使用它们。

它并不总是正确的 - 所以在你的例子中,如果你:

 say Dump $dumper; 

Perl不知道say是获取两个参数还是一个。它必须猜测,并且并不总是猜对。特别是say可以接受一系列要打印的内容,这使得它实际上相当复杂。但是您也可以给它一个文件句柄进行打印-它区分它们的方法是通过原型。
单参数子例程通常很明显您有子例程和参数,但其他任何内容都可能存在歧义。
但正如perldoc perlsub所说:
引用:“方法调用也不受原型的影响,因为在编译时无法确定要调用的函数,因为调用的确切代码取决于继承。”
因此,简短的答案是-您不能这样做,只需使用括号即可。

原型是无关紧要的。带参数的子程序可以在不使用括号的情况下调用,而方法则不行。为什么?say 有点奇怪,它接受一个文件句柄,后面没有逗号。 say Dump $dumper; 很难理解,但我认为 Indent $dumper, 0; 应该按预期工作。虽然我不太关心间接语法。我的主要问题还没有得到答复。 $dumper->Indent(0);$dumper->Indent 0; 的区别。后者不起作用。为什么?很明显这是一个方法调用,还能是什么?没有参数,Perl 可以识别,但有参数就不行了。奇怪。为什么?也许有一些技巧或者黑科技可以解决? - barney765

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接