-1

我有一个文件,其中包含:

foo1 = 1

foo2 =  2

foo3 =    8

.
.
.

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

谢谢你的帮助,

约哈德。

4

4 回答 4

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

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

于 2009-07-12T13:47:31.833 回答
2

这是一个

%h = ("foo1"=>3, "foo2"=>5);
while (<>)
{
    #Substitute value according to expression on right hand side
    s/(\w+) = .*/$1 . " = ". $h{$1}/e;
    print;
}
于 2009-07-12T13:37:14.950 回答
1

单程

%hash = ("foo1"=>33,"foo2" => 44,"foo3"=>99);
while (<>){
  chomp;
  ( $one , $two ) = split /\s+=\s+/, $_;
  print "$one = $hash{$one} \n"
}
于 2009-07-12T13:26:46.897 回答
0

s/regexPattern/replacementPattern/flags

“我是一根绳子!”

s/\sam/'s/g

“我是一根绳子!”

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

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

于 2009-07-12T13:28:15.087 回答