按意外顺序打印

时间:2014-07-11 22:41:36

标签: arrays perl

我希望以下内容按@Data元素的顺序打印,但按照@Queries元素的顺序打印。我错过了什么吗?我还尝试在foreach(@data){...之后声明要打印的项目,然后在该循​​环内打印,但仍然是错误的顺序。

$datafile是一个包含以下内容的文件:

GR29929,JAMES^BOB
GR21122,HANK^REN

$queryfile是一个包含以下内容的文件:

(3123123212):# FD  [GR21122]
line 2
line 3
line 4
(12): # FD         [HANK^REN]
line 6
line 7
line 8
(13): # FD           [Y]
-------------------------------
--------------------------------
(3123123212):# FD  [GR29929]
line 2
line 3
line 4
(12): #  FD       [JAMES^BOB]
line 6
line 7
line 8
(13): # FD           [Z]

输出文件是:

GR21122,HANK^WREN,Y
GR29929,JAMES^BOB,Z

我想要的时候:

GR29929,JAMES^BOB,Z    
GR21122,HANK^WREN,Y

代码是:

open(DA, "<$datafile");
open(QR, "<$queryfile");
my @Data = <DA>;
my @Queries = <QR>;
foreach (@Data) {
    my ( $acce, $namee ) = split( ',', $_ );
    chomp $acce;
    chomp $namee;
    print "'$acce' and '$namee'\n";

    for my $i ( 0 .. $#Queries ) {
        my $Qacce = $Queries[$i];
        my $Qname = $Queries[ $i + 4 ];
        my $Gen   = $Queries[ $i + 8 ];

        if ( $Qacce =~ m/$acce/ and $Qname =~ m/$namee/ ) {
            my ($acc) = $Qacce =~ /\[(.+?)\]/;
            my ($gen) = $Gen =~ /\[(.+?)\]/;
            $gen =~ s/\s+$//;
            my ($name) = $Qname =~ /\[(.+?)\]/;

            print GL "$i,$acc,$gen,$name\n";
        }
    }
}

1 个答案:

答案 0 :(得分:1)

程序的基本shell打印出你要求的内容,但是有很多内容缺失。下面的重构应该做你想要的。

您的$i索引变量的值存在问题,因此第一次围绕循环访问@data元素[0, 4, 8],第二次{{1}看起来第二个循环执行应该使用元素[1, 5, 9]等等。如果我错了,请纠正我。

此外,您使用正则表达式来比较两个文件中的键,并且您没有找到任何内容,因为名称值包含在正则表达式中特殊的插入符[11, 15, 19]字符。使用^转义字符串修复此问题。

请注意,更好的解决方案是使用哈希来匹配两个文件中的密钥,但没有关于文件格式的详细信息 - 尤其是\Q...\E - 我必须遵循您自己的算法。

queryfile

<强>输出

use strict;
use warnings;
use autodie;

my ($data_file, $query_file) = qw/ datafile.txt queryfile.txt /;

my @queries = do {
  open my $query_fh, '<', $query_file;
  <$query_fh>;
};
chomp @queries;

open my $data_fh,  '<', $data_file;

while (<$data_fh>) {
  chomp;
  my ($acce, $namee) = split /,/;

  for (my $i = 0; $i < @queries; $i += 11) {
    my ($qacce, $qname, $qgen) = @queries[$i, $i+4, $i+8];

    if ( $qacce =~ /\Q$acce\E/ and $qname =~ /\Q$namee\E/ ) {
      my ($acc, $name, $gen) = map / \[ ( [^\[\]]+ ) \] /x, ($qacce, $qname, $qgen);
      $gen =~ s/\s+\z//;

      print "$acc,$name,$gen\n";
    }
  }
}