glob跳过文件

时间:2011-05-13 23:27:08

标签: perl file search loops glob

  

可能重复:
  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";



 }

运行代码后,我得到以下打印件:

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 个答案:

答案 0 :(得分:2)

在标量上下文中,glob遍历glob匹配的所有文件,在最后一个文件后返回undef。它旨在用作while循环中的条件,例如:

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

迭代器与glob的特定调用绑定。一旦迭代开始,就没有办法尽早重置迭代器。 glob在返回undef之后才会忽略其参数。

您可以在列表上下文中使用glob来修复问题:

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

答案 1 :(得分:0)

我的猜测是目录Vesuvious_C6R8_051211不包含文件* WIRB_Rabcd_RT.txt,* WIRD_Rabcd_RT.txt和* WIRE_Rabcd_RT.txt。该目录的文件列表是什么?另外,我建议您检查open()的返回码,以确保它确实成功打开了文件。