Как изменить "х" и "у" в строке на "у" и "х", используя хэш

Я пытаюсь заменить строки в огромный файл содержит много строк.

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;
Другие вопросы по тегам