交换值
swapping values
我想知道是否有如下 easy/clean 交换值的方法,也许使用单个 regex/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/;
你可以像你展示的那样把它挤成一行,也许 /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{} // |ex;
say $string;
}
//
(定义或)用于处理最后一个字符不在散列中的情况,在这种情况下 $swap{}
returns undef
.感谢 user52889 的评论。
要交换单个字符,您可以使用 tr///
。
不确定您的清洁度或舒适度标准是什么,但您甚至可以在替换的右侧执行此操作:
$xy = "test_x" =~ s`([xy])$`=~tr/xy/yx/r`re; # $xy is "test_y"
这简直就是:
$a =~ s/x$/y/ or $a =~ s/y$/x/;
进行匹配以查看是否应该进行替换几乎总是多余的。
另一种方式:
substr($a,-1) =~ y/xy/yx/;
我想知道是否有如下 easy/clean 交换值的方法,也许使用单个 regex/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/;
你可以像你展示的那样把它挤成一行,也许 /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{} // |ex;
say $string;
}
//
(定义或)用于处理最后一个字符不在散列中的情况,在这种情况下 $swap{}
returns undef
.感谢 user52889 的评论。
要交换单个字符,您可以使用 tr///
。
不确定您的清洁度或舒适度标准是什么,但您甚至可以在替换的右侧执行此操作:
$xy = "test_x" =~ s`([xy])$`=~tr/xy/yx/r`re; # $xy is "test_y"
这简直就是:
$a =~ s/x$/y/ or $a =~ s/y$/x/;
进行匹配以查看是否应该进行替换几乎总是多余的。
另一种方式:
substr($a,-1) =~ y/xy/yx/;