如何使用“s ///”运算符来更改值的数量?

时间:2009-07-12 13:20:40

标签: perl substitution

我有一个包含以下内容的文件:

foo1 = 1

foo2 =  2

foo3 =    8

.
.
.

我需要用一部分内存哈希值替换该文件中的值(1,2,8 ...),具有相同键的值(foo1 - > 33,foo2 - > 44, foo3 ...)如何使用“s ///”运算符更改它?如果有其他优雅的方式来进行,我会很高兴知道。

感谢您的帮助,

Yohad。

4 个答案:

答案 0 :(得分:6)

my %new_values = ( foo1 => 33, ... );
$data =~ s{^(?<key>\w+) = \K(?<old_value>.+)$}
          {$new_values{$+{key}}}gem;

键是“e”标志,它允许您运行代码以确定替换。 (?<...>)语法提高了可读性,\K允许我们匹配整行但只替换值区域。 “g”标志尽可能多地重复替换,“m”标志使^...$匹配一行而不是整个字符串。 (如果在应用正则表达式之前拆分行,则可能不需要gm。)

答案 1 :(得分:2)

这是一个

%h = ("foo1"=>3, "foo2"=>5);
while (<>)
{
    #Substitute value according to expression on right hand side
    s/(\w+) = .*/$1 . " = ". $h{$1}/e;
    print;
}

答案 2 :(得分:1)

单程

%hash = ("foo1"=>33,"foo2" => 44,"foo3"=>99);
while (<>){
  chomp;
  ( $one , $two ) = split /\s+=\s+/, $_;
  print "$one = $hash{$one} \n"
}

答案 3 :(得分:0)

S / regexPattern / replacementPattern /标志

“我是一个字符串!”

S / \ SAM /'S / G

“我是一个字符串!”

http://gnosis.cx/publish/programming/regular_expressions.html

根据描述,我真的无法理解你在做什么。你能提供样品输入和输出吗?