代码之家  ›  专栏  ›  技术社区  ›  sleske

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

  •  26
  • sleske  · 技术社区  · 14 年前

    s/ s码/ 将在适当位置更改其参数(字符串)。但是,我想在打印之前替换字符串的一部分,如

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

    有这样的吗 replace 是用Perl函数,还是用其他方法? s码/

    5 回复  |  直到 14 年前
        1
  •  78
  •   daxim Fayland Lam    5 年前
    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'
    
        2
  •  5
  •   Eugene Yarmash    5 年前

    如果您有Perl5.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
  •  2
  •   Ali Mohammadi ring bearer    12 年前
    print "bla: ", $myvar =~ tr{a}{b},"\n";
    
        4
  •  1
  •   unbeli    14 年前
    print "bla: ", $_, "\n" if ($_ = $myvar) =~ s/a/b/g or 1;
    
        5
  •  0
  •   vol7ron    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;
       }