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

不鼓励的perl习语的起源:&x(…)和sub x($$){…}

发布时间:2020-12-15 23:29:13 所属栏目:大数据 来源:网络整理
导读:在我的perl代码中,我之前使用过以下两种写作风格,我后来发现它们在现代perl中被劝阻: # Style #1: Using before calling a user-defined subroutinename_of_subroutine($something,$something_else);# Style #2: Using ($$) to show the number of argument
在我的perl代码中,我之前使用过以下两种写作风格,我后来发现它们在现代perl中被劝阻:

# Style #1: Using & before calling a user-defined subroutine
&name_of_subroutine($something,$something_else);

# Style #2: Using ($$) to show the number of arguments in a user-defined sub
sub name_of_subroutine($$) {
  # the body of a subroutine taking two arguments.
}

由于不了解这些风格,我只是停止使用它们.

但是,出于好奇,我想知道以下内容:

>这两种写作风格的起源是什么? (我敢肯定我自己没有想过这些款式.)
>为什么这两种写作风格在现代perl中不鼓励?
>在某个时间点,这些款式被认为是最佳做法吗?

解决方法

&由于两个原因,sigil不常用于现代Perl中的函数调用.首先,它很大程度上是多余的,因为Perl会将任何看起来像函数(后跟parens)的东西视为一个函数.其次,执行方式& function()和&功能之间存在重大差异,这可能会使经验不足的Perl程序员感到困惑.在第一种情况下,调用该函数时不带参数.在第二种情况下,使用当前的@_调用该函数(它甚至可以对参数列表进行更改,这将在该范围内的后续语句中看到:

sub print_and_remove_first_arg {print 'first arg: ',shift,"n"}

sub test {
   &print_and_remove_first_arg;

   print "remaining args: @_n";
}

test 1,2,3;

版画

first arg: 1
remaining args: 2 3

所以最终,使用&对于每个函数调用最终隐藏少数&函数;可能导致很难找到错误的电话.另外,使用& sigil阻止了对函数原型的尊重,这在某些情况下很有用(如果你知道你在做什么),但也可能导致难以追踪错误.最终,&是功能行为的强大修饰符,只应在需要该行为时使用.

原型是相似的,它们的使用应该在现代Perl中受到限制.必须明确说明的是Perl中的原型不是函数签名.它们是编译器的提示,告诉它以与内置函数类似的方式解析对这些函数的调用.也就是说,原型中的每个符号都告诉编译器在参数上强加那种类型的上下文.在定义行为类似于map或push或keys的函数时,此功能非常有用,这些函数的处理方式与标准列表运算符不同.

sub my_map (&@) {...}  # first arg is either a block or explicit code reference

my @ret = my_map {some_function($_)} 1 .. 10;

不鼓励sub($$){…}和原型的类似用法的原因是因为9次中有10次作者意味着“我想要两个args”而不是“我想要两个args,每个args都有一个强加于调用的标量上下文现场”.前一个断言写得更好:

use Carp;
sub needs2 {
   @_ == 2 or croak 'needs2 takes 2 arguments';
   ...
}

这将允许以下调用样式按预期工作:

my @array = (2,4);

needs2 @array;

总结一下,这两个& sigil和函数原型是有用且功能强大的工具,但只有在需要该功能时才能使用它们.它们的多余使用(或作为参数验证的误用)导致意外行为并且难以追踪错误.

(编辑:李大同)

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

    推荐文章
      热点阅读