perl在文件之间循环和检查

perl在文件之间循环和检查,perl,Perl,perl编程仍然有问题,我需要被迫编写一个脚本。 我有两个文件,我想使用列表文件从数据中“提取”行。问题在于列表文件的格式如下: X1 A B X2 C D X3 E F 我的数据如下所示: A X1 2 5 B X1 3 7 C X2 1 4 D X2 1 5 X1 A B 2 5 3 7 X2 C D 1 4 1 5 我需要从列表文件中获取元素对,通过该列表文件选择数据文件中的行。同时,我想编写如下输出: A X1 2 5 B X1 3 7 C X2 1 4 D X2 1 5 X1

perl编程仍然有问题,我需要被迫编写一个脚本。 我有两个文件,我想使用列表文件从数据中“提取”行。问题在于列表文件的格式如下:

X1 A B
X2 C D
X3 E F
我的数据如下所示:

A X1 2 5
B X1 3 7
C X2 1 4
D X2 1 5
X1 A B 2 5 3 7
X2 C D 1 4 1 5
我需要从列表文件中获取元素对,通过该列表文件选择数据文件中的行。同时,我想编写如下输出:

A X1 2 5
B X1 3 7
C X2 1 4
D X2 1 5
X1 A B 2 5 3 7
X2 C D 1 4 1 5
我正在尝试编写perl代码,但无法生成有用的东西。我在这一点上:

open (LIST, "< $fils_list") || die "impossibile open the list";
@list = <LIST>;
close (LIST);
open (HAN, "< $data") || die "Impossible open data";
@r = <HAN>;
close (HAN);
for ($p=0; $p<=$#list; $p++){
chomp ($list[$p]);
($x, $id1, $id2) = split (/\t/, $list[$p]);
$pair_one = $id1."\t".$x;
$pair_two = $id2."\t".$x;

for ($i=0; $i<=$#r; $i++){
chomp ($r[$i]);
($a, $b, $value1, $value2) = split (/\t/, $r[$i]);
$bench = $a."\t".$b;

if (($pair_one eq $bench) || ($pair_two eq $bench)){
print "I don't know what does this script must print!\n";
}
}
}
open(LIST,“<$fils_LIST”)| | die“无法打开列表”;
@列表=;
关闭(列表);
开放(韩,“<$data”)| |死“不可能的开放数据”;
@r=;
接近(汉族);

对于($p=0;$p一些一般性建议:

  • 缩进代码以显示程序的结构
  • 使用有意义的变量名,而不是
    $a
    $value1
    (如果我在下面这样做,这是因为我缺乏领域知识)
  • 使用适合您的程序的数据结构
  • 不要再执行像解析一行这样的操作
  • 在Perl中,每个程序都应该
    使用strict;使用warnings;
  • 使用autodie
    进行自动错误处理

另外,使用
open
功能,如
openmy$fh,“一些一般建议:

  • 缩进代码以显示程序的结构
  • 使用有意义的变量名,而不是
    $a
    $value1
    (如果我在下面这样做,这是因为我缺乏领域知识)
  • 使用适合您的程序的数据结构
  • 不要再执行像解析一行这样的操作
  • 在Perl中,每个程序都应该
    使用strict;使用warnings;
  • 使用autodie
    进行自动错误处理

另外,使用
open
函数,如
open my$fh,“我就是这样做的,主要是使用散列、散列和数组引用(test1.txt和test2.txt包含您在示例中提供的数据):

使用严格;
使用警告;

open(my$f1,“我将这样做,主要使用散列和散列以及数组引用(test1.txt和test2.txt包含您在示例中提供的数据):

使用严格;
使用警告;

打开(my$f1,'是否合并2个文件并保留x1,X2作为键?是否将数据可视化为x1=[A,B,2,5,3,7]同样?@forvaidya我想使用从“列表文件”派生的对从数据中提取行。@forvaidya不是你说的可视化,而是我在问题中写的可视化。你想合并两个文件,并保留x1,X2作为键吗?你想将数据可视化为x1=[A,B,2,5,3,7]吗?@forvaidya我想使用从“列表文件”派生的对从数据中提取行。@forvaidya不是您所说的可视化,而是我在问题中所写的可视化哇!…非常清楚和非常有用的解释。非常感谢!我学到了很多!哇!…非常清楚和非常有用的解释。非常感谢!我学到了很多!谢谢,您的解决方案对我来说很好。有什么问题吗我得到了阿蒙的答案,因为我收到了全面的解释。无论如何,非常感谢!谢谢你,你的解决方案对我很好。无论如何,我得到了阿蒙的答案,因为我收到了全面的解释。无论如何,非常感谢你!
open my $list_fh, "<", $fils_list;
LINE: while(<$list_fh>) {
  chomp;
  my ($id1, @id2s) = split /\t/;
  my $data_id1 = $data{$id1};
  defined $data_id1 or next LINE;  # maybe there isn't anything here. Then skip

  my @values = map @{ $data_id1->{$_} }, @id2s;  # map the 2nd level ids to their values and flatten the list

  # now print everything out:
  say join "\t", $id1, @id2s, @values;
}
use strict;
use warnings;

open(my $f1, '<','test1.txt') or die "Cannot open file1: $!\n";
open(my $f2, '<','test2.txt') or die "Cannot open file2: $!\n";

my @data1 = <$f1>;
my @data2 = <$f2>;

close($f1);
close($f2);

chomp @data1;
chomp @data2;

my %result;

foreach my $line1 (@data1) {
    my @fields1 = split(' ',$line1);
    $result{$fields1[0]}->{$fields1[1]} = [];
    $result{$fields1[0]}->{$fields1[2]} = [];
}

foreach my $line2 (@data2){
    my @fields2 = split(' ',$line2);
    push @{$result{$fields2[1]}->{$fields2[0]}}, $fields2[2];
    push @{$result{$fields2[1]}->{$fields2[0]}}, $fields2[3];
}

foreach my $res (sort keys %result){
    foreach (sort keys %{$result{$res}}){
        print $res . " " . $_ . " " .  join (" ", sort @{$result{$res}->{$_}}) . "\n";
    }
}