将(||'。')应用于变量

时间:2016-08-19 20:16:43

标签: perl

我正在学习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 ||'。';) 我知道它是传递给子例程的变量,但我不知道它需要什么值。提前谢谢。

2 个答案:

答案 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