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

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

概述在我的perl代码中,我之前使用过以下两种写作风格,我后来发现它们在现代perl中被劝阻: # Style #1: Using & before calling a user-defined subroutine&name_of_subroutine($something, $something_else);# Style #2: Using ($$) to show the number 在我的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 subsub 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: 1remaining args: 2 3

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

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

sub my_map (&@) {...}  # first arg is either a block or explicit code referencemy @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和函数原型是有用且功能强大的工具,但只有在需要该功能时才能使用它们.它们的多余使用(或作为参数验证的误用)导致意外行为并且难以追踪错误.

总结

以上是内存溢出为你收集整理的不鼓励的perl习语的起源:&x(…)和sub x($$){…}全部内容,希望文章能够帮你解决不鼓励的perl习语的起源:&x(…)和sub x($$){…}所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1267900.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存