我想知道是否有一个简单/干净的交换值的方式如下,也许使用一个正则表达式/替换?交换值
如果$ a以“x”结尾,则将其替换为“y”。而同样的,如果$与“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/;
我想知道是否有一个简单/干净的交换值的方式如下,也许使用一个正则表达式/替换?交换值
如果$ a以“x”结尾,则将其替换为“y”。而同样的,如果$与“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/;
这很简单:
$a =~ s/x$/y/ or $a =~ s/y$/x/;
这几乎总是多余的做一个匹配,看看你是否应该做一个替代。
另一种方式:
substr($a,-1) =~ y/xy/yx/;
你可以像你这样的线挤显示,也许有点更好/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的评论。
要交换单个字符,您可以使用tr///
。
不知道你的标准,清洁或缓解,但你甚至可以做到这一点,替代的右侧里面是什么:
$xy = "test_x" =~ s`([xy])$`$1=~tr/xy/yx/r`re; # $xy is "test_y"
或使用此优化版本:'$ a =〜s /.$/$&=~ y,xy,yx,r/e;'。但是,只有当你讨厌那些必须阅读你的代码的人时才这样做! –
为什么优化? '$&'在一些perls上有性能惩罚。 – user52889
明显地,为了让那些不得不阅读代码的人得到优化。 –
这很不错,谢谢! – Subbeh