gpt4 book ai didi

perl - 不鼓励的 perl 习惯用法的起源 : &x(. ..) 和 sub x($$) { ... }

转载 作者:行者123 更新时间:2023-12-03 18:21:01 26 4
gpt4 key购买 nike

在我的 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 会将任何看起来像函数(后跟括号)的东西视为函数。其次,&function()的方式有很大区别。和 &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

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

    原型(prototype)是相似的,它们的使用应该在现代 Perl 中受到限制。必须明确说明的是 Perl 中的原型(prototype)不是函数签名。它们是对编译器的提示,告诉它以与内置函数类似的方式解析对这些函数的调用。也就是说,原型(prototype)中的每个符号都告诉编译器将那种类型的上下文强加到参数上。在定义行为类似于 map 的函数时,此功能非常有用。或 pushkeys它们都以不同于标准列表运算符的方式对待他们的第一个参数。
    sub my_map (&@) {...}  # first arg is either a block or explicit code reference

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

    原因 sub ($$) {...}不鼓励使用原型(prototype)的类似用途是因为 10 次中有 9 次作者的意思是“我想要两个 args”,而不是“我想要两个 args,每个 args 都在调用站点上施加标量上下文”。前一个断言写得更好:
    use Carp;
    sub needs2 {
    @_ == 2 or croak 'needs2 takes 2 arguments';
    ...
    }

    这将允许以下调用样式按预期工作:
    my @array = (2, 4);

    needs2 @array;

    综上所述, & sigil 和函数原型(prototype)是有用且强大的工具,但仅应在需要该功能时使用。它们的多余使用(或作为参数验证的误用)会导致意外行为并且难以追踪错误。

    关于perl - 不鼓励的 perl 习惯用法的起源 : &x(. ..) 和 sub x($$) { ... },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2843745/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com