perl:canot在循环中打开文件

ola*_*ala 0 io perl

我试图读取一堆类似的文件并逐个处理它们.这是我的代码.但不知何故,perl脚本无法正确读取文件.我不确定如何解决它.这些文件绝对是我可读写的.

#!/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;

}  
Run Code Online (Sandbox Code Playgroud)

当我运行它时,出现错误消息(如下所示):

cannot open /full_dir_to_file/a.txt
Run Code Online (Sandbox Code Playgroud)

cjm*_*cjm 6

每个文件名末尾都有换行符:

my @olap_f = `ls ~dir_to_file/*txt`;
chomp @olap_f; # Remove newlines
Run Code Online (Sandbox Code Playgroud)

更好的是,使用glob以避免启动新进程(并且必须修剪换行符):

my @olap_f = glob "~dir_to_file/*txt";
Run Code Online (Sandbox Code Playgroud)

另外,用于$!找出无法打开文件的原因:

open(IN,'<',$file) || die "cannot open $file: $!";
Run Code Online (Sandbox Code Playgroud)

这会告诉你的

cannot open /full_dir_to_file/a.txt
: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这可能让你识别出不需要的换行符.

  • 我建议添加 - 使用词法范围的文件句柄,因为它通常更好的风格.`open(我的$ input,"<",$ file)或者死!$ ;; (5认同)