以前、ループ内のループに取り組んでいましたが、一致した場合、2 番目のループ ファイルの文字列全体が置き換えられました。今、私は少し異なる状況にあります。最初のループの部分文字列を 2 番目のループの文字列に置き換えようとしています。どちらも csv ファイルで、セミコロンで区切られています。私が置き換えようとしているのは特殊文字です:数値コードから文字自体まで最初のファイルは次のようになります:
1;2;blałblabla ąbla;7;8
3;4;bląblabla;9;10
2;3;blablablaąał8;9
2 番目のファイルには、数値コードと対応する文字が含まれています。
Ą;Ą
ą;ą
Ǟ;Ǟ
Á;Á
á;á
Â;Â
ł;ł
2 番目のファイルの最初のセミコロンは、対応する文字の数値コードに属しており、ファイルの分割には使用しないでください。結果は次のようになります。
1;2;blałblabla ąbla;7;8
3;4;bląblabla;9;10
2;3;blablablaąał;8;9
これは私が持っているコードです。どうすればこれを修正できますか?
use strict;
use warnings;
my $inputfile1 = shift || die "input/output!\n";
my $inputfile2 = shift || die "input/output!\n";
my $outputfile = shift || die "output!\n";
open my $INFILE1, '<', $inputfile1 or die "Used/Not found :$!\n";
open my $INFILE2, '<', $inputfile2 or die "Used/Not found :$!\n";
open my $OUTFILE, '>', $outputfile or die "Used/Not found :$!\n";
my $infile2_pos = tell $INFILE2;
while (<$INFILE1>) {
s/"//g;
my @elements = split /;/, $_;
seek $INFILE2, $infile2_pos, 0;
while (<$INFILE2>) {
s/"//g;
my @loopelements = split /;/, $_;
#### The problem part ####
if (($elements[2] =~ /\&\#\d{3}\;/g) and (($elements[2]) eq ($loopelements[0]))){
$elements[2] =~ s/(\&\#\d{3}\;)/$loopelements[1]/g;
print "$2. elements[2]\n";
}
#### End problem part #####
}
my $output_line = join(";", @elements);
print $OUTFILE $output_line;
#print "\n"
}
close $INFILE1;
close $INFILE2;
close $OUTFILE;
exit 0;