Как я могу использовать оператор “s ///”, чтобы изменить количество значений?

StackOverflow https://stackoverflow.com/questions/1116034

  •  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

Судя по описанию, я действительно не могу понять, что вы делаете.Можете ли вы предоставить образец ввода и вывода?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top