gpt4 book ai didi

Perl 子例程参数

转载 作者:行者123 更新时间:2023-12-02 23:31:59 24 4
gpt4 key购买 nike

我最近一直在阅读有关 Perl 的内容,并且对 Perl 如何处理传递给子例程的参数感到有点困惑。

在 Python、Java 或 PHP 等语言中,函数定义采用以下形式(伪代码):

function myFunc(arg1, arg2) {
// Do something with arg1 and arg2 here
}

然而在 Perl 中它只是:

sub mySub {
# @_ holds all arguments passed
}

据我了解,这是唯一的方法。

  • 如果我想限制调用者只传递两个参数怎么办?

  • 这难道不是 Perl 在其他语言(即 Python、C 等)中不允许除可变数字参数之外的任何内容吗?

  • 这会不会在某个时候成为一个问题?

  • 其他语言中的所有默认参数编号检查怎么样?是否必须在 Perl 中显式地执行此操作?例如

      sub a_sub {
    if (@_ == 2) {
    # Continue function
    }
    else {
    return false
    }
    }

最佳答案

您对 Perl 环境持谨慎态度,因为它与您以前遇到过的语言有很大不同。

相信强类型和函数原型(prototype)的人可能会不同意,但我相信这样的限制很少有用。 C真的发现您经常向函数传递错误数量的参数吗?

在现代 Perl 中最常见的是将 @_ 的内容复制到词法标量变量列表中,因此您经常会看到以

开头的子例程
sub mysub {
my ($p1, $p2) = @_;
... etc.
}

这样,传递的所有参数都可以作为@_的元素使用($_[0], $_[1] 等),而预期的 则被命名并出现在 $p1$p2 中(尽管我希望您理解应该适当选择这些名称)。

在子例程是方法的特殊情况下,第一个参数是特殊的。在其他语言中,它是 selfthis,但在 Perl 中,它只是 @_ 中的第一个参数,您可以随意调用它。在这种情况下你会看到

sub method {
my $self = shift;
my ($p1, $p2) = @_;
... etc.
}

这样上下文对象(或者类的名称,如果它是类方法)被提取到 $self (约定的名称)中,其余参数保留在 @_ 可以直接访问,或者更常见的是复制到局部标量变量,如 $p1$p2 等。

最常见的提示是也没有类型检查,因此我可以传递任何我喜欢的标量作为子例程参数。只要 use strictuse warnings 在上下文中,即使这样通常也很容易调试,因为子例程可以对一种形式的标量执行的操作通常是非法侵害他人。

虽然它最初更多地与面向对象 Perl 的封装有关,但 Larry Wall 的这句话非常相关

Perl doesn't have an infatuation with enforced privacy. It would prefer that you stayed out of its living room because you weren't invited, not because it has a shotgun

C 在设计和实现的时候,如果你能让一个有问题的程序在编译期间而不是在运行时失败,那么它可以大大提高效率。现在情况已经改变,尽管客户端 JavaScript 也出现了类似的情况,在从互联网获取需要处理的数据之前知道代码是错误的实际上会很有用。遗憾的是,JavaScript 参数检查现在比应有的宽松。

<小时/>

更新

对于那些怀疑 Perl 对于教学目的的有用性的人,我建议这正是因为 Perl 的机制非常简单和直接,因此对于此类目的来说它们是理想 .

  • 当您调用 Perl 子例程时,调用中的所有参数都以 @_ 形式别名。您可以直接使用它们来影响实际参数,或者复制它们以防止外部操作

  • 如果您将 Perl 子例程作为方法调用,则调用对象或类将作为第一个参数提供。同样,子例程(方法)可以使用 @_

  • 做它喜欢做的事情

关于Perl 子例程参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19234209/

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