Perl 将(shift |';';)应用于变量

Perl 将(shift |';';)应用于变量,perl,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 = re

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

该语句说:“从参数列表中提取下一个元素,并将其分配给
$path
。如果列表中没有参数,或者第一个元素的计算结果为false,请将
放在
$path
中。”

shift
,当在程序的主要部分中使用而不是在子例程中使用时,使用
@ARGV
(命令行参数)作为其列表,将
shift
元素移出

use warnings;
use strict;

my $x = shift || 'bye';

print "$x\n";
运行它:

$ perl script.pl
bye

$ perl script.pl hi
hi

在子例程之外,不带参数的
shift
执行
shift@ARGV
,获取第一个命令行参数

如果左侧为truthy,则
|
运算符返回左侧;如果左侧为falsy,则返回右侧。因此,如果
shift
成功,
$path
可能会设置为命令行参数。如果
@ARGV
为空,
shift
返回
unde
,因此
$path
将被设置为

注意:例如,如果您有一个名为“0”的目录,并试图运行
myscript.pl 0
,那么这将导致错误