交换价值

时间:2016-12-22 23:16:08

标签: regex perl substitution

我想知道是否有一种简单/干净的方式交换值如下,可能使用单个正则表达式/替换?

如果$ a以" x"结尾,请将其替换为" y"。同样,如果$ a以" y"结尾,则将其换成" x":

$a = "test_x";

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

我只能想到这样的事情:

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

3 个答案:

答案 0 :(得分:10)

这很简单:

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

进行比赛几乎总是多余的,看你是否应该进行替换。

另一种方式:

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

答案 1 :(得分:5)

你可以像你展示的那样挤压它,或许用.exrc(v5.14 +)更好一点。

或者你可以准备哈希。这也减轻了代码对特定字符进行硬编码的负担。

/r

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; } (defined-or)用于处理最后一个字符不在哈希中的情况,在这种情况下//返回$swap{$1}。感谢user52889发表评论。

答案 2 :(得分:3)

要交换单个字符,您可以使用tr///

不确定您的清洁或轻松的标准,但您甚至可以在替换的右侧进行此操作:

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