早些時候我在循環內工作,如果匹配成功,它會從第二個循環文件中替換整個字符串。現在我有一個稍微不同的情況。我試圖用第二個循環的字符串替換第一個循環的子字符串。它們都是csv文件並以分號分隔。我想要替換的特殊字符:從數碼到人物本身的第一個文件是這樣的:用第二個csv文件中的字符串替換子字符串
1;2;blałblabla ąbla;7;8
3;4;bląblabla;9;10
2;3;blablablaąał8;9
和第二個文件的數字代碼和相應的字符:
Ą;Ą
ą;ą
Ǟ;Ǟ
Á;Á
á;á
Â;Â
ł;ł
第二個文件中的第一個分號屬於相應字符的數字代碼,不應該用於分割文件。結果應該是:
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;
謝謝!這很容易:) – Jan 2012-07-16 09:07:16
@Borodin所以在設置binmode到utf8之後,這是否只適用於打印?如果我將decode_entities的返回值存儲到var,它會起作用嗎? – Rooster 2014-02-13 00:15:44