我正在尝试在Perl中创建一个简单的递归阶乘函数,它将从命令行中获取一个数字,然后返回它的阶乘,例如
>./factorial.pl 3
>6
Run Code Online (Sandbox Code Playgroud)
我的子程序似乎没有采用命令行参数.但是,如果我在没有子包装器的情况下使用完全相同的代码,它会采用命令行参数,但显然不能用作子例程.以下是代码:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
sub fact() {
my $number = shift or return;
return 0 if $number < 0;
my $results = 1;
while ($number--) { $results *= $number--};
return $results;
}
Run Code Online (Sandbox Code Playgroud)
shift在子默认情况下从@_(子的参数)转移; 在子外部,它默认从@ARGV(命令行参数)移位.
所以无论是打电话fact(shift)还是明确说shift(@ARGV)出来fact.
并摆脱()原型:sub fact {...
子程序参数被打包@_.传递@ARGV给子程序(并摆脱空原型 - 除非你确切知道他们做了什么,否则不要使用原型):
#!/usr/bin/env perl
use warnings; use strict;
print fact(@ARGV), "\n";
sub fact {
my ($number) = @_;
# ...
}
Run Code Online (Sandbox Code Playgroud)