我有一个代码,它能够读取两个文件作为输入,并在输出中的两个写入匹配元素之间进行比较。让我们将脚本读取的 $list_file 视为用于从 $data_file 中选择元素的固定列表。我试图让这个脚本在一个文件夹中循环并读取具有特定名称模式的多个 data_files,但我遇到了一个错误,我无法解决它。
这是我的名为“list.txt”的列表文件:
X1 A B
X2 C D
X3 E F
我的第一个 data_file 名为“data_file1.txt”:
A X1 2 5
B X1 3 7
C X2 1 4
D X2 1 5
我的第二个 data_file 名为“data_file2.txt”:
E X3 5 7
F X3 3 4
G X4 2 3
H X4 2 5
我想获得如下所示的输出:
X1 A B 2 5 3 7
X2 C D 1 4 1 5
X3 E F 5 7 3 4
我的两个 data_files 都在一个包含其他文件的文件夹中,所以我需要匹配“数据”作为模式来识别正确的输入。
这是我的代码:
my $list_file = "list.txt";
my $dirname = "data_directory";
my $dh;
use strict;
use warnings;
use autodie;
use feature 'say';
opendir ($dh, $dirname) || die "Impossible open the $dirname!";
while (my $data_file = readdir ($dh)){
if ("$dh/$data_file" =~ /data/){
open my $data_fh, "<", $data_file;
my %data;
while (<$data_fh>) {
chomp;
my ($id2, $id1, @data) = split /\t/;
$data{$id1}{$id2} = \@data;
}
open my $list_fh, "<", $list_file;
LINE: while(<$list_fh>) {
chomp;
my ($id1, @id2s) = split /\t/;
my $data_id1 = $data{$id1};
defined $data_id1 or next LINE;
my @values = map @{ $data_id1->{$_} }, @id2s;
say join "\t", $id1, @id2s, @values;
}
}
}
closedir (DIR);
如果我运行此代码,我只会为第一个 data_file 获得正确的结果。此外,我收到此错误:
"Can't open 'data_file2.txt' for reading: 'No such file or directory' at code.pl line 23"
欢迎提出建议!