私は単純なループに取り組んでいますが、機能していません。共通の ID に基づいて比較する 2 つのファイルがあります。最初の結果と最初の結果のみを出力するため、機能します。そのため、残りのファイル (または出力に最初のファイルのすべての行が含まれているため、最後のファイル) をループしていません。最初のファイルのすべての行を出力しますが、2 番目のファイルの最初の結果のみを出力ファイルに追加します。明確にするための私のコードは次のとおりです。
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);
それで、誰かが私のコードのどこが間違っているのか指摘できますか?