2016-08-19 2 views
1

В настоящее время я изучаю perl, и когда я столкнулся с частью кода, объясняя, как пересечь дерево каталогов с помощью рекурсивных подпрограмм. Это код в вопросеПрименение (shift || '.') К переменной

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; 
} 

я понял подпрограмму и как она работает, но я не понимаю, это заявление: ; Я знаю, что это (мой путь $ = сдвиг || «») переменную, которая передается подпрограмме, но я не знаю, какое значение она принимает. Заранее спасибо.

ответ

2

Вне подпрограммой, shift без аргументов делает shift @ARGV, получая первый аргумент командной строки.

Оператор || возвращает левую сторону, если левая сторона является правдивой или правая, если левая сторона является ложной. Итак, если shift преуспел, $path, вероятно, будет установлен в аргумент командной строки. Если @ARGV был пуст, shift возвращает undef, поэтому $path вместо этого получит значение '.'.

Обратите внимание, что это будет сделано не так, если, например, у вас есть каталог с именем «0» и попробуйте запустить myscript.pl 0.

0

Это утверждение говорит: «тянуть следующий элемент из списка аргументов и присвоить его $path Если нет аргументов в списке, или первый элемент имеет значение неправду, . в $path вместо этого.».

shift, когда используется в основной части программы, а не в подпрограмме, используется @ARGV (аргументы командной строки) в качестве ее списка для shift элементов.

use warnings; 
use strict; 

my $x = shift || 'bye'; 

print "$x\n"; 

Выполнить это:

$ perl script.pl 
bye 

$ perl script.pl hi 
hi 
Смежные вопросы