2016-12-22 4 views
5

Мне было интересно, существует ли простой/чистый способ обмена значениями следующим образом, возможно, с использованием одного регулярного выражения/замены?значения подкачки

Если $ a заканчивается на «x», замените его на «y». И точно так же, если $ а концы с «у», поменять его с «х»:

$a = "test_x"; 

if ($a =~ /x$/) { 
    $a =~ s/x$/y/; 
} else { 
    $a =~ s/y$/x/; 
} 

я могу думать только о чем-то вроде этого:

$a = $a =~ /x$/ ? s/x$/y/ : s/y$/x/; 

ответ

10

Это просто:

$a =~ s/x$/y/ or $a =~ s/y$/x/; 

Это почти всегда избыточно, чтобы выполнить матч, чтобы увидеть, следует ли вам делать замену.

Другой способ:

substr($a,-1) =~ y/xy/yx/; 
+0

это здорово, спасибо! – Subbeh

5

Вы можете сжать его в линию, как вы шоу, возможно, немного приятнее с /r (с v5.14 +).

Или вы можете подготовить хэш. Это также освобождает код от жесткого кодирования определенных символов.

my %swap = (x => 'y', y => 'x', a => 'b', b => 'a'); # expand as needed 

my @test = map { 'test_' . $_ } qw(x y a b Z); 

for my $string (@test) 
{ 
    $string =~ s| (.)$ | $swap{$1} // $1 |ex; 

    say $string; 
} 

// (определенный или) есть обрабатывать случай, когда последний символ не находится в хэш, в этом случае $swap{$1} возвращает undef. Спасибо user52889 за комментарий.

+0

'S /(.)$/$ своп {$ 1}/é': Вы, вероятно, также нужно обрабатывать случай, когда последний символ не является ни' x' ни 'у '. – user52889

+0

@ user52889 Действительно - спасибо! Исправлена. – zdim

+0

приятное чистое решение, спасибо! – Subbeh

3

Для замены отдельных символов вы можете использовать tr///.

Не уверен, что ваши критерии чистоты и легкости, но вы даже можете сделать это в правой части подстановки:

$xy = "test_x" =~ s`([xy])$`$1=~tr/xy/yx/r`re; # $xy is "test_y" 
+0

Или используйте эту оптимизированную версию: '$ a = ~ s /.$/$&= ~ y, xy, yx, r/e;'. Но делайте это только в том случае, если вы ненавидите людей, которые будут читать ваш код! –

+2

Оптимизирован для чего? '$ &' имеет штрафы за производительность на некоторых perls. – user52889

+1

Оптимизирован для того, чтобы развратить людей, которые должны прочитать код, очевидно. –

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

  • Нет связанных вопросов^_^