2016-12-22 7 views
5

おそらく単一の正規表現/置換を使用して、次のように値をスワップするのが簡単で清潔な方法があるのだろうか?値をスワップ

$ aの末尾に「x」がある場合は、「y」に置き換えます。そして、「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/; 

は、それはほとんど常にですあなたが代用をするべきかどうかを知るためにマッチするために冗長です。

もう一つの方法は次のとおりです。■/(.)$/$スワップ{$ 1}/e`

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; 
} 

//(定義-OR)は、最後の文字がundefを返す$swap{$1}その場合ハッシュでない場合を処理するために存在します。コメントのためにuser52889に感謝します。

+0

':あなたはおそらくも最後の文字が 'X'や' Yでもないケースを処理したいです'。 – 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

最適化されたものは何ですか? '$&'はいくつかのperlにパフォーマンス上の不利益を与えます。 – user52889

+1

明らかに、コードを読まなければならない人々を怒らせるために最適化されています。 –