我正在学习perl,当我遇到一段代码时,解释了如何使用递归子例程遍历目录树。这是有问题的代码
use strict;
use warnings;
use 5.010;
my $path = shift || '.';
traverse($path);
sub traverse {
my ($thing) = @_;
return if not -d $thing;
opendir my $dh, $thing or die;
while (my $sub = readdir $dh) {
next if $sub eq '.' or $sub eq '..';
say "$thing/$sub";
traverse("$thing/$sub");
}
close $dh;
return;
}
我理解子程序及其工作原理,但我不理解这句话: (我的$ path = shift ||'。';) 我知道它是传递给子例程的变量,但我不知道它需要什么值。提前谢谢。
答案 0 :(得分:2)
在子例程之外,shift
没有参数shift @ARGV
,获取第一个命令行参数。
如果左侧是真实的,||
运算符返回左侧,如果左侧是假的,则shift
运算符返回右侧。因此,如果$path
成功,@ARGV
可能会被设置为命令行参数。如果shift
为空,undef
会返回$path
,因此'.'
将设置为myscript.pl 0
。
请注意,如果您有一个名为“0”的目录并尝试运行{0}/api/now/table/cmdb_ci_vm_instance?sysparm_offset=0&sysparm_limit=750&sysparm_exclude_reference_link=true&sysparm_query=ORDERBYsys_id
2016-08-19 12:46:15,277 [INFO ] Returned Records Count: 750
{0}/api/now/table/cmdb_ci_vm_instance?sysparm_offset=750&sysparm_limit=750&sysparm_exclude_reference_link=true&sysparm_query=ORDERBYsys_id
2016-08-19 12:46:28,243 [INFO ] Returned Records Count: 746
,则会出错。
答案 1 :(得分:0)
该声明说:"从参数列表中提取下一个元素并将其分配给$path
。如果列表中没有参数,或者第一个元素的计算结果为false,则将.
放在$path
而不是#34;。
shift
,在程序的主要部分使用而不是在子程序中使用@ARGV
(命令行参数)作为其shift
元素的列表。
use warnings;
use strict;
my $x = shift || 'bye';
print "$x\n";
运行它:
$ perl script.pl
bye
$ perl script.pl hi
hi