2015-05-19 55 views
0

我正在嘗試讀取一堆類似的文件並逐個處理它們。這是我的代碼。但不知何故perl腳本不能正確讀入文件。我不知道如何解決它。這些文件絕對是我可讀寫的。perl:canot打開循環內的文件

#!/usr/bin/perl 
use strict; 
use warnings; 

my @olap_f = `ls /full_dir_to_file/*txt`; 

foreach my $file (@olap_f){ 
    my %traits_h; 

    open(IN,'<',$file) || die "cannot open $file"; 

    while(<IN>){ 
     chomp; 
     my @array = split /\t/; 
     my $trait = $array[4]; 
     $traits_h{$trait} ++; 
    } 
    close IN; 

} 

當我運行它,錯誤消息(類似下面)出現了:

cannot open /full_dir_to_file/a.txt 
+7

不使用'ls',爲什麼不使用'glob'?它正確地擴展了'〜'的路徑。 – tadman

+2

'使用Data :: Dumper; $ Data :: Dumper :: Useqq = 1;打印Dumper \ @olap_f;'會告訴你到底發生了什麼事。 – ThisSuitIsBlackNot

+0

我不知道glob和Data :: Dumper。感謝您的建議。 – olala

回答

6

你在每個文件名末尾有換行符:

my @olap_f = `ls ~dir_to_file/*txt`; 
chomp @olap_f; # Remove newlines 

更重要的是,使用glob以避免啓動新過程(並且不得不修剪換行符):

my @olap_f = glob "~dir_to_file/*txt"; 

此外,使用$!找出爲什麼文件無法打開:

open(IN,'<',$file) || die "cannot open $file: $!"; 

這會告訴你

cannot open /full_dir_to_file/a.txt 
: No such file or directory 

這可能使你認識到不必要的換行。

+0

chomp解決了這個問題!感謝您的其他建議! – olala

+5

我建議添加 - 使用詞法範圍的文件句柄,因爲它通常是更好的風格。 '打開(我的$輸入,「<」,$文件)或死$ !;' – Sobrique

1

我會在這裏爲IO::All添加一個快速插件。重要的是要知道什麼是引擎蓋下回事,但它有時方便能夠做到:

use IO::All; 
my @olap_f = io->dir('/full_dir_to_file/')->glob('*txt'); 

在這種情況下,它並不比@軍事審判的使用glob較短,但IO::All確實有對工作的一些其他方便的方法與文件以及。