2010-08-09 21 views
23

在Perl中,運算符s/用於替換部分字符串。現在s/將改變其參數(字符串)到位。不過,我想在Perl:使用s /(替換)並返回新字符串

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

替換字符串的部分befor打印出來,因爲有這樣replace功能Perl或一些其他的方式來做到這一點? s/將不會直接在這種情況下工作,我想避免使用輔助變量。有沒有辦法做到這一點?

+1

可能重複http://stackoverflow.com/questions/22836/how-do-i-perform- a-perl-substitution-on-a-string-while-keeping-the-original) – daxim 2011-02-09 07:13:56

回答

49

未經測試:

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

參見perl5132delta

取代操作者現在支持A/R選項,副本輸入變量,執行在複印的取代,並返回結果。原始文件保持不變。

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

哇,新的選項,不錯 – unbeli 2010-08-09 13:31:05

+0

好的whaddya知道!非常便利。如果我知道這件事,我會在大約80%的時間內使用它! – 2010-08-09 13:41:43

+0

啊,現在我看到它實際上是最近的...... Perl 5.13.2。因此,尋找老版本的解決方法仍然很有趣。 – 2010-08-09 13:47:09

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"; 
+1

已添加到[提交4f4d7508b0c2c114e5f52420e0e87a853c5f642a](http://perl5.git.perl.org/perl.git/commit/4f4d7508b0c2c114e5f52420e0e87a853c5f642a)。 – daxim 2010-08-09 13:30:47

+0

有趣,不知道'do()'。但我的目的有點混亂: - /。 – sleske 2010-08-09 15:23:33

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

對不起,我不明白。爲什麼「如果」? – sleske 2010-08-09 15:30:00

+0

@sleske:如果'$ myvar'不包含'a'會怎麼樣。在這種情況下,'$ _'將是未定義的。這也是爲什麼在這個答案中增加了'或1',爲了強制'打印'繼續前進,即使沒有任何東西可以替代。不是非常可讀的IMO。 – Zaid 2010-08-09 15:50:12

+0

@Zaid:? $ _不會是未定義的;它只是設置爲$ myvar。 ,$ _, 「\ n」 個' – ysth 2010-08-09 16:21:04

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; 
    } 
2
print "bla: ", $myvar =~ tr{a}{b},"\n"; 
的[我如何在一根繩子上執行一個Perl替換,同時保持原有的?](