加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

没有括号的Perl方法调用

发布时间:2020-12-16 06:25:33 所属栏目:大数据 来源:网络整理
导读:我的一个项目包含许多简单的方法调用.我想要 无括号地调用它们以避免混乱并且更容易进行频繁修改. 我做了以下测试. 括号(显然有效): 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]);

$dumper->Indent(0);

say $dumper->Dump();

现在没有括号(仅适用于没有参数的方法)

my $something = [1,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,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不会允许它的真正原因,因为似乎没有任何歧义.对于sub我们有“使用subs”,方法可能存在类似的东西吗?

为了完整起见,有没有办法在上面的例子中避免使用’say2’子句并仍然没有括号?

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

解决方法

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

它并不总能做到这一点 – 所以在你的例子中,如果你:

say Dump $dumper;

Perl不知道是说是获得两个参数还是一个.它必须猜测,并不总是正确猜测.特别是说它实际上相当复杂,因为你可以给它一系列要打印的东西.但你也可以给它一个文件句柄来打印 – 它通过原型告诉差异的方式.

单个参数子程序通常很明显你有sub和参数,但其他任何东西都可能是模棱两可的.

但正如perldoc perlsub所说:

“Method calls are not influenced by prototypes either,because the function to be called is indeterminate at compile time,since the exact code called depends on inheritance”

所以简短的回答是 – 你不能这样做,只需使用括号.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读