perl - 如何知道perl子例程是否带参数

标签 perl parameters subroutine

我是 perl 的新手,我似乎找不到任何关于如何知道子例程是否采用参数的信息。

在其他语言(例如python、java等)中,很明显,一个方法/函数通常是这样的:

    def my_func(arg1, arg2):
        # do something

但是在 perl 中,它只是:

    sub my_func {
        my params = @_;
        # do something
    }

但我见过这样的例子,其中甚至没有包含 my params = @_,但是子例程被调用并传递了一个参数。

例如

    sub my_func {
        my $self = shift;
        my $fieldstr = 'tbl'.$self->db_func.'*,';
        my $sql = "SELECT $fieldstr FROM tbl".$self->db_func.'WHERE'.$self->...;

        my $sth = $self->other_func->my_func($sql) or return undef;
    }

所以我想知道是否有某种准则可以知道子例程是否采用参数?

最佳答案

请看my answer to a similar question .

Perl 非常灵活,因为子例程可以简单地忽略多余的参数,为丢失的参数提供默认值,或者如果参数完全是什么预期。

Perl 的作者,Larry Wall , 是一位语言学家,其背后的基本原理是子程序的行为类似于命令式动词;所以就像你可以说“拿木头”“从棚子后面拿木头”,或者“用拖拉机”,你同样可以说

fetch($wood)
fetch($wood, $shed)
fetch($wood, $shed, $tractor)

甚至

fetch($wood, {from => 'shed', using => 'tractor'})

由子例程来确定需要什么。

应避免使用子例程原型(prototype),因为它们具有以不明显的方式改变代码行为的副作用。它们仅用于编写额外的语言结构;一个很好的例子是 Try::Tiny .

关于perl - 如何知道perl子例程是否带参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26410459/

相关文章:

perl - 有条件地从菜单中排除菜单选项

perl - 在 XS 代码中祝福空引用时泄漏

c# - 正则表达式,从分隔字符串中删除重复路径

c++ - 在 C++ 中将指针数组作为参数传递

fortran - 包含声明

perl - 如何测试 Perl 模块以检查 Makefile.PL 是否声明了所有依赖项?

linux dirty_writeback_centisecs 内核参数无效

Powershell - 如何将命令行参数传递给模块中的函数?

perl - 如何向 Perl 子例程传递和读取文件句柄?

Fortran 'call' 语句 : what can it actually call?