【问题标题】:swapping values交换值
【发布时间】:2016-12-22 23:16:07
【问题描述】:

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

如果 $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/;

【问题讨论】:

    标签: regex perl substitution


    【解决方案1】:

    这很简单:

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

    进行匹配以查看是否应该进行替换几乎总是多余的。

    另一种方式:

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

    【讨论】:

      【解决方案2】:

      你可以像你展示的那样把它挤成一行,用/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 的评论。

      【讨论】:

      • s/(.)$/$swap{$1}/e:您可能还想处理最后一个字符既不是x也不是y的情况。
      【解决方案3】:

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

      不确定您对清洁度或舒适度的标准是什么,但您甚至可以在替换的右侧执行此操作:

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

      【讨论】:

      • 或者使用这个优化版本:$a =~ s/.$/$&=~y,xy,yx,r/e;。但只有当你讨厌那些必须阅读你的代码的人时才这样做!
      • 针对什么进行了优化? $& 在某些 perls 上有性能损失。
      • 显然是为了激怒必须阅读代码的人而优化的。
      猜你喜欢
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多