Как я могу использовать оператор “s ///”, чтобы изменить количество значений?
-
12-09-2019 - |
Вопрос
У меня есть файл, который содержит:
foo1 = 1
foo2 = 2
foo3 = 8
.
.
.
Мне нужно заменить только значения (1,2,8 ...) в этом файле частью хэш-значений памяти, теми, у которых одинаковые ключи (foo1 -> 33, foo2 -> 44, foo3 ...) Как я могу изменить это с помощью оператора "s ///"?Если есть другие элегантные способы провести это, я буду рад узнать.
Спасибо за любую помощь,
Йохад.
Решение
Одностороннее движение
%hash = ("foo1"=>33,"foo2" => 44,"foo3"=>99);
while (<>){
chomp;
( $one , $two ) = split /\s+=\s+/, $_;
print "$one = $hash{$one} \n"
}
Другие советы
my %new_values = ( foo1 => 33, ... );
$data =~ s{^(?<key>\w+) = \K(?<old_value>.+)$}
{$new_values{$+{key}}}gem;
Ключом является флаг "e", который позволяет вам запустить код для определения замены.Тот самый (?<...>)
синтаксис повышает удобочитаемость, а \K
позволяет нам сопоставить всю строку, но заменить только область значений.Флаг "g" повторяет замену столько раз, сколько возможно, а флаг "m" делает ^...$
сопоставьте строку, а не всю строку целиком.(Тот самый g
и m
вероятно, в этом не будет необходимости, если вы разделите строки перед применением регулярного выражения.)
Вот один
%h = ("foo1"=>3, "foo2"=>5);
while (<>)
{
#Substitute value according to expression on right hand side
s/(\w+) = .*/$1 . " = ". $h{$1}/e;
print;
}
s/regexPattern/replacementPattern/флаги
«Я — струна!»
с/\сэм/с/г
«Я — струна!»
http://gnosis.cx/publish/programming/regular_expressions.html
Судя по описанию, я действительно не могу понять, что вы делаете.Можете ли вы предоставить образец ввода и вывода?