使用Perl原型有什么缺点吗?

时间:2015-08-05 16:16:21

标签: perl prototype subroutine

我会在参数列表周围不使用括号来调用我的潜艇。例如,我想使用

mypush \@list, $item;

而不是

mypush(\@list, $item);

为了实现这一点,我已经用原型声明了我的潜艇。

sub mypush (+@) { push shift, @_ }

事实上,这也允许我接下来,但这只是一个奖励:

mypush @list, $item;

除了必须在代码中的任何地方之前使用原型声明子例程之外,在Perl中使用原型是否有任何严重的缺点?

代码看起来对我来说非常清晰。但一般情况下原型出错的地方?我什么时候后悔呢?

2 个答案:

答案 0 :(得分:5)

最大的缺点之一是它使代码难以维护。很少有人能够理解Perl原型实际上做了什么,所以周围有很多猜测和货物结果。

请注意,Perl 5.20添加了subroutine signature feature。它仍然是实验性的,但它真的很棒,大多数人都希望原型能做到。并且,当我们添加类型约束时(哦圣诞老人,请请带给我圣诞节的那些我保证我会好!),我们将拥有我认为大多数人尝试用原型做的事情(与我编写的一些语法:

sub foo (Int $foo, String $var, Int @array) { ... }

答案 1 :(得分:1)

你的问题没有实际意义,因为原型对parens的需求没有影响。只要sub在它被使用之前被声明,parens是可选的。

$ perl -E'
   sub foo { say @_; }
   foo "bar";
'
bar

$ perl -E'
   sub foo;
   foo "bar";
   sub foo { say @_; }
'
bar

请注意,省略parens存在严重缺点。

  1. 很容易意外地将错误的参数传递给子:

    $ perl -E'
       sub foo { say @_; }
       foo 9*6;
       foo (4+5)*6;
    '
    54
    9
    
  2. 代码中的错误可能会导致误导和混淆错误消息。

    $ perl -E'foo bar "baz";'
    Can't locate object method "foo" via package "bar"
       (perhaps you forgot to load "bar"?) at -e line 1.
    

    Here当你省略parens时,另一个为你存储的古怪的例子。

  3. 问题可能比使用原型产生的问题更糟糕。使用这些"功能之一"看起来并不明智;引入这两组问题的可能性更小。