2016-08-19 15 views
1

現在、私は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; 
} 

問題のコードです: 、私はそれがあることを知っている (私の$パス=シフトを||「」)サブルーチンに渡される変数ですが、どのような値が必要なのかわかりません。前もって感謝します。

答えて

2

、引数なしでshiftは、最初のコマンドライン引数を取得し、shift @ARGVを行います。

||オペレータは、左側が真実である場合は左側を返し、左側が偽である場合は右側を返します。したがって、shiftが成功した場合、$pathはおそらくコマンドライン引数に設定されます。 @ARGVが空の場合、shiftundefを返すので、代わりに$path'.'に設定されます。

たとえば、 "0"という名前のディレクトリがあり、myscript.pl 0を実行しようとすると、これは間違ったことになります。

0

「引数リストから次の要素を取り出し、それを$pathに割り当てます。リストに引数がない場合、または最初の要素がfalseと評価された場合は.$pathに置き換えてください。

shiftは、プログラムのメイン部分で使用され、サブルーチンで使用されていない場合、shiftの要素のリストとして@ARGV(コマンド行引数)を使用します。

use warnings; 
use strict; 

my $x = shift || 'bye'; 

print "$x\n"; 

実行して:サブルーチンの外

$ perl script.pl 
bye 

$ perl script.pl hi 
hi 
関連する問題