我是perl的新手,我似乎无法找到有关如何知道子程序是否采用参数的任何信息。
在其他语言中(例如python,java等),很明显,方法/函数通常如下所示:
def my_func(arg1, arg2):
# do something
但在perl中,它只是:
sub my_func {
my params = @_;
# do something
}
但我已经看到了我的params = @_ 甚至不包括在内的示例,但子程序被调用并传递参数。
e.g
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;
}
所以我想知道是否有某种指导方针可以知道子程序是否带有参数?
答案 0 :(得分:4)
请查看my answer to a similar question。
Perl是超灵活的,因为子程序可以简单地忽略多余的参数,为缺失的参数提供默认值,或者die
如果参数不是完全预期的。< / p>
Perl的作者Larry Wall是一位语言学家,其背后的理由是子程序就像命令式动词一样;就像你可以说“取木头”,“从棚子后面取木头,或”从棚子后面取木头拖拉机“,你可以同样地说
fetch($wood)
fetch($wood, $shed)
fetch($wood, $shed, $tractor)
甚至
fetch($wood, {from => 'shed', using => 'tractor'})
由子程序决定是否需要。
应避免使用子程序原型,因为它们具有以不明显的方式改变代码行为的副作用。它们仅用于编写其他语言结构;一个很好的例子是Try::Tiny
。
答案 1 :(得分:3)
参数在@_
中传递,因此您需要查找@_
的使用情况。例如,
my ($x, $y) = @_;
shift
与shift(@_)
$_[$i]
&f
(但不是&f()
),与sub log_warn { unshift @_, 'warn'; &log }
作为副作者,你应该尽可能使用它们作为sub的顶部,以使它们显而易见。最后两个通常用作优化或具有引用参数。
答案 2 :(得分:1)
子程序调用的参数包含在数组@_
中。
数组操作的两个重要功能是shift
和pop
。假设你有一个列表(1,2,3,4)。
shift
从列表左侧删除一个值并将其返回。
my @list = ( 1, 2, 3, 4 );
my $value = shift @list;
print "$value\n"; # will print "1"
print "@list\n"; # will print "2 3 4"
pop
从右侧而不是左侧执行相同的操作:
my @list = ( 1, 2, 3, 4 );
my $value = pop @list;
print "$value\n"; # will print "4"
print "@list\n"; # will print "1 2 3"
在子程序中使用时,pop
和shift
默认使用@_
数组:
some_function( 'James', 99 ); #these 2 arguments will be passed to the function in "@_"
sub some_function {
my $name = shift; #remove 'James' from list @_ and store it in $name
my $age = shift; #remove 99 from list @_ and store it in $age
print "Your name is $name and your age is $age\n";
}