2011-05-13 8 views
1

가능한 중복 :
Why does Perl's glob return undef for every other call?글로브 건너 뛰는 파일

이 나는 ​​긴 이름을 가진 파일을 찾을 필요가 내가 가진 한 또 다른 문제의 연속이다하지만 내가 알고있는 것을 이름의 일부는 여기에 사용 된 코드입니다.

my @RTlayerRabcd = ("WIRA_Rabcd_RT","WIRB_Rabcd_RT","WIRC_Rabcd_RT","WIRD_Rabcd_RT","WIRE_Rabcd_RT","BASE_Rabcd_RT"); 

#Rabcd calculations 
for($i = 0; $i < 6; $i++) 
{ 
    print "@RTlayerRabcd[$i]\n"; 
    #Searching for Rabcd Room Temperature readings 
    my $file = glob($dir . "*@RTlayerRabcd[$i]" . '.txt'); 
    print "$file\n"; 
    my $Rtot = 0; 
    #Open file, Read line 
    open (FILE, $file); 
    while (<FILE>) 
    { 
     #read line and and seperate at "tab" into $temp, $Res 
     chomp; 
     ($Res, $temp) = split("\t"); 
     $j++; 
     $Rtot=$Res+$Rtot; 

    } 
    close (FILE); 

    $Ravg = $Rtot/$j; 
    print FILE_OUT "$Ravg \t"; 



} 

코드를 실행 한 후 다음 p 인쇄물 출력 :

WIRA_Rabcd_RT                
Vesuvious_C6R8_051211/vesu_R6C8_05112011_WIRA_Rabcd_Rt.txt 
WIRB_Rabcd_RT 

WIRC_Rabcd_RT              
Vesuvious_C6R8_051211/vesu_R6C8_05112011_WIRC_Rabcd_Rt.txt        
WIRD_Rabcd_RT             

WIRE_Rabcd_RT             

BASE_Rabcd_RT            
Vesuvious_C6R8_051211/vesu_R6C8_05112011_BASE_Rabcd_Rt.txt 

프로그램이 파일을 건너 뛰는 것 같습니다. 이유는 무엇입니까?

+2

사용이 엄격하고 경고, 당신의'개방에 조건부()를 사용합니다', 당신은 몇 가지 정보를 얻을 수 있습니다. 분명히 글로브는 파일을 찾지 못합니다. 또한. '@array [0]'이 아닌'$ array [0]'은 배열 요소를 참조하는 방법입니다. – TLP

답변

2

스칼라 컨텍스트에서 glob은 glob로 일치하는 모든 파일을 반복하며 마지막 것 다음에 undef을 반환합니다. 예를 들어, while 루프 상태로 사용하기위한 것 :

while (my $file = glob('*.c')) { 
    say $file; 
} 

반복자는 glob에 특정 전화 연결되어 있습니다. 반복이 시작되면 반복자를 일찍 재설정 할 방법이 없습니다. globundef을 반환 할 때까지 인수를 무시합니다.

당신은 목록 컨텍스트에서 glob를 사용하여 문제를 해결할 수 :

my ($file) = glob($dir . "*@RTlayerRabcd[$i]" . '.txt'); 
+0

또는'glob'를 사용하여 여러 파일을 얻고'grep'을 사용하여 올바른 파일을 얻으십시오. – TLP

+0

고마워요. 이거 완벽하게 작동했습니다. – Lpaulson

0

내 생각에 Vesuvious_C6R8_051211 디렉토리에 * WIRB_Rabcd_RT.txt, * WIRD_Rabcd_RT.txt 및 * WIRE_Rabcd_RT.txt 파일이 포함되지 않았을 것입니다. 해당 디렉토리의 파일 목록은 무엇입니까? 또한 open()의 반환 코드를 확인하여 실제로 파일을 성공적으로 열 었는지 확인하는 것이 좋습니다.

+0

아니요, 스칼라 컨텍스트에서는'glob'를 호출하지만 루프 조건에서는 호출하지 않기 때문입니다. – cjm

관련 문제