【问题标题】:Is it possible to prototype a subroutine as $$& in perl?是否可以在 perl 中将子例程原型化为 $$&?
【发布时间】:2011-12-03 01:11:15
【问题描述】:

只是好奇,我玩过原型设计,但似乎子程序的原型& 只允许在第一个位置。

当我写作时

sub test (&$$) {
    do_something;
}

并将其称为

test {doing_something_else} 1,2;

它有效。

当我做这样的原型时

sub test ($$&) {
    do_something;
}

然后再次将其称为

test 1,2 {doing_something_else};

它不起作用。我尝试了各种排列,但似乎没有任何效果。

我错过了什么,还是不可能?如果不是,为什么?

(我可能需要说明,我成功尝试了调用 test(1, 2, sub{foo}) 的选项,当然,但它看起来不像上面最后一个示例中的选项那么性感(为此我什至不需要原型);我希望能够实现结构的语法,如 if () {} else {} 等,或者更重要的是,try () catch () {} 或 switch () case (){},但我想这就是为什么这些结构还没有在 Perl 中实现的原因)

【问题讨论】:

  • “它不起作用”是not a good problem description
  • 造成这种情况的原因通常是解析不明确:perl 无法判断您是要调用test $this, $that { BLOCK } 还是test $this, $that{HASHELEM}
  • @TLP:同意,还在赶上这里的语法;-)

标签: perl prototype


【解决方案1】:

& 原型字符仅在它是原型中的第一项时才采用块形式。这只是 perl 的原型解析器工作方式的一个限制。

您始终可以使用sub 关键字来创建一个匿名子例程,该子例程可以在没有原型的任何位置作为参数正常工作。

test 1, 2, sub {doing_something_else};

如果你真的想在没有sub 的情况下编写它,但又不想在第一个位置,你可以用Devel::Declare 来为测试子例程编写你自己的解析规则玩得很开心(这是一个高级主题)。

【讨论】:

  • 感谢Devel::Declare,我想我会稍微重写一下语言;-) 或者至少失败了...
【解决方案2】:

引用文档 (perldoc perlsub):

一个“&”需要一个匿名子例程,如果作为first传递 参数,不需要“sub”关键字或后续逗号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 2012-09-17
    • 2020-07-17
    相关资源
    最近更新 更多