Perl:使用s /(replace)并返回新字符串

时间:2010-08-09 13:17:51

标签: regex perl replace

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

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

Perl中是否有这样的replace函数,或者其他一些方法呢? s/在这种情况下不会直接工作,我想避免使用辅助变量。有没有办法在线进行此操作?

5 个答案:

答案 0 :(得分:60)

未测试:

require 5.013002;
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'

答案 1 :(得分:3)

在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";

答案 2 :(得分:2)

print "bla: ", $myvar =~ tr{a}{b},"\n";

答案 3 :(得分:1)

print "bla: ", $_, "\n" if ($_ = $myvar) =~ s/a/b/g or 1;

答案 4 :(得分:0)

如果你真的想要,你可以创建自己的,但我不会因为你有更多功能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;
   }