2016-02-15 8 views
0

У меня есть строка, которая содержитЛучший способ изменить математический оператор

$str = a > b; 
$str1 = c < d; 
$str2 = e = f; 

Что такое лучший способ сделать, если я хочу, чтобы изменить оператор, например> стать <,> стать < = стать! знак равно Единственный способ, которым я знаю, - выполнить сопоставление и получить a и b и использовать функцию соединения, чтобы присоединиться к a и b с противоположным оператором. Любой лучший способ сделать это?

+3

Звучит как 'XY Problem'. Пожалуйста, объясните, что вы пытаетесь выполнить. – Sobrique

+3

Ваш пример действителен Perl-код, но не делает того, что вы думаете. Пожалуйста, отредактируйте свой вопрос и покажите реальные примеры реальной жизни. – simbabque

ответ

1

Предполагая, что ваши строки действительно так:

$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.

+0

Вы можете использовать http://regex101.com для игры. – simbabque

+0

/g возможно захочется на замену – ysth

+0

@simbabque Спасибо за эту работу для меня. Но если строка является чем-то вроде $ str = "a = b и c = d". Как я могу сменить два знака? – tim

Смежные вопросы