我的一个项目包含很多简单的方法调用。我想要 不加括号地调用它们以避免混乱并且更容易进行频繁修改。
我做了以下测试。
括号(显然有效):
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不允许这样做的真正原因,因为它似乎没有任何含糊之处。对于潜艇,我们有'#34;使用sub",或许类似的东西存在于方法中?
为了完整起见,有没有办法避免说出' say2'在上面的例子中,仍然没有括号调用?
也许有某种黑客或诡计可能吗?
答案 0 :(得分:5)
我认为我们在这里讨论的是prototyping
- 你可以为子程序指定一个原型,它显示了它所期望的参数和类型。如果你没有原型,perl必须猜测参数是什么类型以及如何使用它们。
它并不总能做到这一点 - 所以在你的例子中,如果你:
say Dump $dumper;
Perl并不知道say
是获得两个参数还是一个参数。它必须猜测,并不总是正确猜测。特别是say
实际上相当复杂,因为你可以给它一系列要打印的东西。但你可以还给它一个文件句柄来打印 - 它通过原型告诉差异的方式。
单个参数子程序它通常很明显你有sub和参数,但其他任何东西都可能是模棱两可的。
但正如perldoc perlsub
所说:
"方法调用也不受原型的影响,因为要调用的函数在编译时是不确定的,因为调用的确切代码取决于继承"
所以简短的回答是 - 你不能这样做,只需使用括号。