我正在处理一个简单的循环,但它不起作用。我有 2 个文件,我根据一个共同的 ID 进行比较。它有点工作,因为它只输出第一个结果和第一个结果!所以它不会遍历其余文件(或最后一个文件,因为输出包含第一个文件中的所有行)。它输出第一个文件中的所有行,但仅将第二个文件中的第一个结果附加到 outfile 中。这是我要澄清的代码:
use strict;
use warnings;
my $inputfile1 = shift || die "Give input & output!\n";
my $inputfile2 = shift || die "Give input & output!\n";
my $outputfile = shift || die "Give input!\n";
open my $INFILE1, '<', $inputfile1 or die "In use / Not found :$!\n";
open my $INFILE2, '<', $inputfile2 or die "In use / Not found :$!\n";
open my $OUTFILE, '>', $outputfile or die "In use / Not found :$!\n";
while (<$INFILE1>) {
s/"//g;
my @elements = split /;/, $_;
while (<$INFILE2>) {
s/"//g;
my @loopelements = split /;/, $_;
if ($elements[11] eq $loopelements[0]){
$elements[12] = $loopelements[1];
$elements[13] = $loopelements[2];
}
}
my $output_line = join(";", @elements);
print $OUTFILE $output_line;
#print "\n"
}
close $INFILE1;
close $INFILE2;
close $OUTFILE;
exit 0;
我的第一次尝试是这段代码,它部分工作。为什么?:中途崩溃。当我检查输出文件时,它工作到大约一半并停止。不知道为什么!顺便说一句,我认为下面的效率较低,或者两者都有更好的选择吗?
$inputfile1=$ARGV[0];
$inputfile2=$ARGV[1];
$outputfile1=$ARGV[2];
open(INFILE1,$inputfile1) || die "Give input & output :$!\n";
open(INFILE2,$inputfile2) || die "Give input & output :$!\n";
open(OUTFILE_1,">$outputfile1") || die "Give input & output :$!\n";
$i = 0;
$j = 0;
@infile1=<INFILE1>;
@infile2=<INFILE2>;
foreach ( @infile1 )
{
@elements = split(";",$infile1[$i]);
$j=0;
foreach ( @infile2 )
{
@loopelements = split(";",$infile2[$j]);
if ($elements[11] eq $loopelements[0]){
$elements[12] = $loopelements[1];
$elements[13] = $loopelements[2];
$printen = 1;
last;
}
$j = $j+1;
}
@elements = join(";",@elements);
print "$i\r";
if ($printen == 1) { print OUTFILE_1 "@elements"; };
$i = $i+1;
}
close(INFILE1);
close(INFILE2);
close(OUTFILE_1);
那么有人可以指出我在顶部的代码中哪里出错了吗?