Как изменить "х" и "у" в строке на "у" и "х", используя хэш
Я пытаюсь заменить строки в огромный файл содержит много строк.
File.txt
line1: "X" = 5.5; "Y" = 7.5; "Z" = 9.0;
line2: "V" = 66; "Y" = 3; "U" = 11.0;
скоро...
Хэш замены (%rhash) содержит информацию о карте
$rhash{"X"} = "Y";
$rhash{"Y"} = "X";
$rhash{"Z"} = "A";
$rhash{"V"} = "B";
$rhash{"U"} = "C";
когда я пытался
while (($cur, $cng) = each(%rhash)) {
$line =~ s/\Q"$cur"\E/\"$cng\"/g;
}
строка 1 меняется на
"X" = 5.5; "X" = 7.5; "A" = 9.0;
или же
"Y" = 5.5; "Y" = 7.5; "A" = 9.0;
но правильное изменение
"Y" = 5.5; "X" = 7.5; "A" = 9.0;
как я могу достичь этого..
Спасибо за вашу помощь...
1 ответ
Решение
Вы должны изменить их одновременно. Самый простой способ - создать составной исполняемый файл regexp и найти подстановку на основе того, что было найдено:
$re = join("|", map { "\\Q$_\\E" } keys(%rhash));
$str =~ s/$re/$rhash{$&}/ge;
Конечно, это работает только в том случае, если ваши ключи замены являются буквальными и не имеют семантики регулярных выражений.
РЕДАКТИРОВАТЬ Если вам нужны такие вещи, как $rhash{"\d+"} = "NUMBER"
, это должно работать:
sub find_replacement {
my ($match, $patterns, $rhash) = @_;
foreach my $pattern (@$patterns) {
if ($match =~ s/$pattern/$$rhash{$pattern}/e) {
return $match;
}
}
die "impossible!";
}
my @patterns = keys(%rhash);
my $re = join("|", @patterns);
$str =~ s/$re/find_replacement($&, \@patterns, \%rhash)/ge;