# 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中不鼓励?
>在某个时间点,这些款式被认为是最佳做法吗?
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($$){…}所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)