【问题标题】:Perl: Use s/ (replace) and return new string [duplicate]Perl:使用 s/ (替换)并返回新字符串 [重复]
【发布时间】:2011-03-27 07:17:39
【问题描述】:

在 Perl 中,运算符s/ 用于替换字符串的一部分。现在s/ 将更改其参数(字符串)。但是,我想在打印之前替换字符串的一部分,如

print "bla: ", replace("a","b",$myvar),"\n";

Perl 中是否有这样的replace 函数,或者其他方法? s/ 在这种情况下不能直接工作,我想避免使用辅助变量。有什么办法可以在线完成吗?

【问题讨论】:

    标签: regex perl replace


    【解决方案1】:
    require 5.013002; # or better:    use Syntax::Construct qw(/r);
    print "bla: ", $myvar =~ s/a/b/r, "\n";
    

    perl5132delta:

    替换运算符现在支持/r 选项,该选项复制输入变量,对副本执行替换并返回结果。原件保持不变。

    my $old = 'cat';
    my $new = $old =~ s/cat/dog/r;
    # $old is 'cat' and $new is 'dog'
    

    【讨论】:

    • 嗯,你知道!非常便利。如果我知道这一点,我会在大约 80% 的时间里使用它!
    • 啊,现在我看到它实际上是最近的...... Perl 5.13.2。因此,寻找旧版本的解决方法仍然很有趣。
    【解决方案2】:

    如果您有 Perl 5.14 或更高版本,您可以使用 /r 选项和替换运算符来执行 non-destructive substitution

    print "bla: ", $myvar =~ s/a/b/r, "\n";
    

    在早期版本中,您可以使用带有临时词法变量的 do() 块来实现相同的目的,例如:

    print "bla: ", do { (my $tmp = $myvar) =~ s/a/b/; $tmp }, "\n";
    

    【讨论】:

      【解决方案3】:
      print "bla: ", $myvar =~ tr{a}{b},"\n";
      

      【讨论】:

        【解决方案4】:
        print "bla: ", $_, "\n" if ($_ = $myvar) =~ s/a/b/g or 1;
        

        【讨论】:

        • 对不起,我不明白。为什么是“如果”?
        • @sleske :如果$myvar 不包含a 怎么办。在这种情况下,$_ 将是未定义的。这也是为什么在此答案中添加了or 1,以强制print 继续进行,即使没有任何替代品。 IMO 的可读性不太好。
        • @Zaid:? $_ 不会是未定义的;它只是设置为 $myvar。最好使用($_ = $myvar) =~ s/a/b/g, print "bla: ", $_, "\n"
        • @ysth:确认。你说得对。 or 1 让我失望了。那么or 1 是否只是造成线路噪音?
        • @Zaid: 不,or 1 确保 if 为真,因此打印甚至发生 - 不需要使用逗号运算符
        【解决方案5】:

        如果您想自己制作(出于语义原因或其他原因),请参阅下面的示例,尽管您只需要 s///

        #!/usr/bin/perl -w    
        
        use strict;     
        
           main();   
        
           sub main{    
              my $foo = "blahblahblah";          
              print '$foo: ' , replace("lah","ar",$foo) , "\n";  #$foo: barbarbar
        
           }        
        
           sub replace {
              my ($from,$to,$string) = @_;
              $string =~s/$from/$to/ig;                          #case-insensitive/global (all occurrences)
        
              return $string;
           }
        

        【讨论】:

          猜你喜欢
          • 2013-04-28
          • 1970-01-01
          • 1970-01-01
          • 2012-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-31
          相关资源
          最近更新 更多