2011-05-13 113 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