regex - How to change "x" and "y" in a line into "y" and "x" using hash -
i trying replace strings in huge file contains many lines.
file.txt
line1: "x" = 5.5; "y" = 7.5; "z" = 9.0; line2: "v" = 66; "y" = 3; "u" = 11.0;
so on ...
the replacement hash (%rhash) contains map information
$rhash{"x"} = "y"; $rhash{"y"} = "x"; $rhash{"z"} = "a"; $rhash{"v"} = "b"; $rhash{"u"} = "c";
when tried
while (($cur, $cng) = each(%rhash)) { $line =~ s/\q"$cur"\e/\"$cng\"/g; }
line 1 change either
"x" = 5.5; "x" = 7.5; "a" = 9.0;
or
"y" = 5.5; "y" = 7.5; "a" = 9.0;
but correct change is
"y" = 5.5; "x" = 7.5; "a" = 9.0;
how can achieve this..
thanks help...
you need change them simultaneously. easiest way make compound executable regexp, , substitution based on matched:
$re = join("|", map { "\\q$_\\e" } keys(%rhash)); $str =~ s/$re/$rhash{$&}/ge;
of course, works if replacement keys literal, , not have regexp semantics.
edit if need things $rhash{"\d+"} = "number"
, should work:
sub find_replacement { ($match, $patterns, $rhash) = @_; foreach $pattern (@$patterns) { if ($match =~ s/$pattern/$$rhash{$pattern}/e) { return $match; } } die "impossible!"; } @patterns = keys(%rhash); $re = join("|", @patterns); $str =~ s/$re/find_replacement($&, \@patterns, \%rhash)/ge;
Comments
Post a Comment