2016-08-19 3 views
1

현재 펄을 배우고 있으며 재귀 서브 루틴을 사용하여 디렉토리 트리를 트래버스하는 방법을 설명하는 코드를 발견했습니다. 이것은 내가 서브 루틴을 이해하고 어떻게 작동하는지, 그러나 나는이 문장 이해하지 못했다변수에 적용 (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이 비어있는 경우 shiftundef을 반환하므로 $path'.'으로 대신 설정됩니다.

예를 들어 "0"이라는 디렉토리가 있고 myscript.pl 0을 실행하려고하면 잘못된 작업이 수행됩니다.

0

다음 진술 : "인수 목록에서 다음 요소를 가져 와서 $path에 할당하십시오. 목록에 인수가 없거나 첫 번째 요소가 거짓으로 평가되면 .$path에 대신 입력하십시오.

shift

, 프로그램의 주요 부분에 아닌 서브 루틴에 사용 된 오프 shift 요소의 목록으로 @ARGV (커맨드 라인 인자)를 사용한다.

use warnings; 
use strict; 

my $x = shift || 'bye'; 

print "$x\n"; 

실행을 :

$ perl script.pl 
bye 

$ perl script.pl hi 
hi