2011-05-13 75 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 rint outs:

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

使用嚴格和警告,使用條件上你的'的open()',那麼你可能會得到一些信息。顯然,glob沒有找到該文件。也。 '$ array [0]',而不是'@array [0]'是引用數組元素的方法。 – TLP 2011-05-13 23:57:42

回答

2

在標量上下文中,glob遍歷glob所匹配的所有文件,最後一個返回undef。它的目的在一個while循環中作爲條件,例如:

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

迭代器被綁定到給glob那個特定呼叫。迭代開始後,無法儘早重置迭代器。 glob直到它返回undef後纔會忽略它的參數。

您可以通過列表環境中使用glob解決您的問題:

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

或者用'glob'獲取一堆文件,並使用'grep'獲取正確的文件。 – TLP 2011-05-14 00:41:41

+0

非常感謝這很好地工作。 – Lpaulson 2011-05-16 17:13:07

0

我的猜測是,Vesuvious_C6R8_051211目錄不包含文件* WIRB_Rabcd_RT.txt,* WIRD_Rabcd_RT.txt和* WIRE_Rabcd_RT.txt。該目錄的文件列表是什麼?另外,我建議您檢查open()的返回碼,以確保它確實成功打開了一個文件。

+0

不,這是因爲他在標量上下文中調用glob,而不是作爲循環條件。 – cjm 2011-05-14 00:26:05