以下を含むファイルがあります。
foo1 = 1
foo2 = 2
foo3 = 8
.
.
.
そのファイルの値 (1,2,8...) のみを、同じキー (foo1 -> 33,foo2 -> 44,foo3...) を持つメモリ ハッシュ値の一部に置き換える必要があります。 「s///」演算子を使用して変更するにはどうすればよいですか? それを実行するための他のエレガントな方法があれば、喜んでお知らせします。
助けてくれてありがとう、
ヨハド。
以下を含むファイルがあります。
foo1 = 1
foo2 = 2
foo3 = 8
.
.
.
そのファイルの値 (1,2,8...) のみを、同じキー (foo1 -> 33,foo2 -> 44,foo3...) を持つメモリ ハッシュ値の一部に置き換える必要があります。 「s///」演算子を使用して変更するにはどうすればよいですか? それを実行するための他のエレガントな方法があれば、喜んでお知らせします。
助けてくれてありがとう、
ヨハド。
my %new_values = ( foo1 => 33, ... );
$data =~ s{^(?<key>\w+) = \K(?<old_value>.+)$}
{$new_values{$+{key}}}gem;
重要なのは「e」フラグで、コードを実行して置換を決定できます。(?<...>)
構文により読みやすさが向上し、行\K
全体を一致させることができますが、値の領域のみを置き換えることができます。「g」フラグは可能な限り置換を繰り返し、「m」フラグは^...$
文字列全体ではなく行に一致させます。(正規表現を適用する前に行を分割する場合g
、およびはおそらく不要です。)m
これが1つです
%h = ("foo1"=>3, "foo2"=>5);
while (<>)
{
#Substitute value according to expression on right hand side
s/(\w+) = .*/$1 . " = ". $h{$1}/e;
print;
}
一方通行
%hash = ("foo1"=>33,"foo2" => 44,"foo3"=>99);
while (<>){
chomp;
( $one , $two ) = split /\s+=\s+/, $_;
print "$one = $hash{$one} \n"
}
s/regexPattern/replacementPattern/フラグ
「私はひもです!」
s/\sam/'s/g
「私はひもです!」
http://gnosis.cx/publish/programming/regular_expressions.html
説明文だけでは何をしているのかよくわかりません。入力と出力のサンプルを提供できますか?