我有一些包含
的字符串$str = a > b;
$str1 = c < d;
$str2 = e = f;
如果我想要反转运营商,例如&gt;,最好的方法是什么?成为&lt; ,&gt;成为&lt; ,=变成!=。我知道的唯一方法是进行匹配并得到a和b并使用join函数将a和b与相对的运算符连接起来。有更好的方法吗?
答案 0 :(得分:1)
假设你的字符串真的像这样:
$str = 'a > b';
$str1 = 'c < d';
$str2 = 'e = f';
对于单字符操作符,您可以使用transliteration operator tr///
,这比正则表达式便宜。
$str =~ tr/<>+-/><-+/;
要将=
转变为!=
,您需要使用s///
回归substitution。
您可以对每个否定使用查找哈希,并将查找键转换为可用于查找的模式。
use strict;
use warnings;
my %op = (
'<' => '>',
'>' => '<',
'=' => '!=',
'!=' => '=',
);
my $pattern = sprintf '(%s)', join '|', map quotemeta, keys %op;
my @strings = ('a > b', 'a < b', 'e = f', 'g != h');
foreach my $str (@strings) {
print $str;
$str =~ s/$pattern/$op{$1}/e;
print " --> $str\n";
}
__END__
a > b --> a < b
a < b --> a > b
e = f --> e != f
g != h --> g = h
quotemeta
确保模式中没有正则表达式元字符。这对于我展示的示例字符并不重要,但它可能在您的完整用例中。
这可能是阅读perlre的好时机。