2014-10-16 25 views
4

我的一个项目包含很多简单的方法调用。我想 不带圆括号称呼它们,以避免混乱,并使频繁修改更容易。不带圆括号的Perl方法调用

我做了以下测试。

用括号(显然作品):

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为什么不允许它的真正原因,因为似乎没有任何含糊之处。对于潜艇我们有“使用潜艇”,也许类似的方法存在?

为了完整性,有没有办法避免在上面的例子中的'say2'子,仍然没有括号调用?

也许有某种黑客或诡计可能?

回答

4

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

它并不总是得到这个权利 - 所以在你的例子,如果你:

say Dump $dumper; 

Perl不知道是否say越来越两个参数或一个。它必须猜测,并不总是正确猜测。特别是say实际上可能相当复杂,因为您可以给它打印一些东西。但你也可以给它一个文件句柄打印到 - 它通过原型告诉其差异的方式。

单参数子例程它通常很明显,你有子和参数,但其他任何可能不明确。

但随着perldoc perlsub说:

“方法调用不受原型的影响或者,因为要调用的函数是在编译时不确定的,因为所谓确切的代码依赖于继承”

所以简短的回答是 - 你不能这样做,只需使用圆括号即可。

+0

原型是不相关的。带参数的子程序可以不带圆括号调用,方法不能。为什么? 'say'有点奇怪,它接受一个文件句柄,后面没有逗号。 '说转储$倾卸器;'是困难的,但我认为'缩进$倾销,0;'应该按预期工作。尽管我不太在意间接语法。 我的主要问题是没有答案。'$ dumper->缩进(0);'vs'$ dumper->缩进0;'。后者不起作用。为什么?很明显这是一个方法调用,它还有什么用?没有参数,Perl知道,但它不知道。奇怪。为什么?也许有可能是黑客或诡计? – barney765 2014-10-17 20:08:43