我希望以下内容按@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";
}
}
}
答案 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";
}
}
}