扭转数学运算符的最佳方法

时间:2016-02-15 14:44:09

标签: regex perl

我有一些包含

的字符串
$str = a > b;
$str1 = c < d;
$str2 = e = f;

如果我想要反转运营商,例如&gt;,最好的方法是什么?成为&lt; ,&gt;成为&lt; ,=变成!=。我知道的唯一方法是进行匹配并得到a和b并使用join函数将a和b与相对的运算符连接起来。有更好的方法吗?

1 个答案:

答案 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的好时机。