Предполагая, что ваши строки действительно так:
$str = 'a > b';
$str1 = 'c < d';
$str2 = 'e = f';
Для операторов односимвольных вы можете использовать transliteration operatortr///
, что дешевле, чем регулярные выражения.
$str =~ tr/<>+-/><-+/;
Для поворота =
в !=
, вам нужно будет возвратиться к substitution, используя s///
.
Вы можете использовать хэш поиска для каждого отрицания и превратить ключи поиска в шаблон, который вы можете использовать для поиска.
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.
Звучит как 'XY Problem'. Пожалуйста, объясните, что вы пытаетесь выполнить. – Sobrique
Ваш пример действителен Perl-код, но не делает того, что вы думаете. Пожалуйста, отредактируйте свой вопрос и покажите реальные примеры реальной жизни. – simbabque