2012-04-09 59 views
1

我有以下perl腳本:=〜如何在Perl中表現?

$myVariable = "some value"; 
//... some code ... 
$myVariable =~ s/\+/ /g; 
$myVariable =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/seg; 
//.. some more code ... 

perl文檔閱讀,我認爲=~符返回boolean值,即truefalse

我的問題是:上述涉及$myVariable的操作是否會影響其值或不是。

N.B.在我的腳本中,$myVariable的值設置爲string,這是$_變量的split的結果。我認爲這不應該影響該行動的行爲。

P.S.如果您需要更多代碼,請立即告訴我。

回答

3

$myVariable已更改,但是因爲您正在替換(s///),而不是因爲匹配或替換的結果是布爾值; =~不像=,它就像==。如果你想要操作的布爾結果,你需要分配它。

$result = $myVariable =~ s/\+/ /g; 
+0

謝謝快速回復! – artaxerxe 2012-04-09 11:21:00

1

=〜本身並不完全代表任何東西,它也需要對其左側的變量進行操作。

要查看某個變量比賽的模式,你在正確的使用行動//,你可能會想用這個作爲一個布爾值,但你也可以用它在其他感官。這不會改變$ foo的:

$foo =~ m/pattern/ 

替代一個模式的替代品,你使用s ///在右邊,這會改變$ foo的:

$foo =~ s/pattern/replacement/; 

翻譯 $ foo中的單個字符,請使用TR ///在右邊,這會改變$ foo的:

$foo =~ tr/abc/def/; 
2

我們正在談論

leftvalue =~ rightvalue 

rightvalue必須是這些東西:

m/regexp/ 
s/regexp/replacement/ 
tr/regexp/translation/ 

leftvalue可以是任何東西,這是一個左值。

表達式leftvalue =~ rightwalue總是計算爲一個布爾值,但是該值沒有賦值給左值!這個布爾值是表達式本身的值!所以,你可以用它很細的,如果子句中:

if (leftvalue =~ rightvalue) { 
    // do something 
} 
  • m/regexp/永遠不會改變任何東西。它只是測試,如果正則表達式匹配左值。
  • s/regexp/replacement/還測試regexp是否與leftvalue相匹配,如果是,則用replacement替換匹配部分。如果正則表達式確實匹配,則leftvalue =~ rightvalue爲真,否則爲false。
  • tr/regexp/replacement/s///類似,但用翻譯代替替換。

因此,這將很好地工作:

my @a=('acbc123','aubu123'); 
foreach (@a) { 
    if ($_ =~ s/c(\d)/x$1/g;) { 
     $_ .= 'MATCHED!'; 
    } 
} 

的結果將是:

a[0] = 'acbx123MATCHED!' 

的 'C',後面跟着一個數字沒有匹配正則表達式。所以ist被替換爲'x'和那個數字。並且因爲它匹配,if語句是正確的,並且「匹配!」被附加到字符串。

a[1] = 'aubu123' 

正則表達式不匹配。沒有任何東西被替換,if語句是錯誤的。

+0

「expresion leftvalue =〜rightwalue總是計算爲一個布爾值,但是這個值沒有賦值給左值!」是錯誤的。例如'my @matches =「abracadabra」=〜/(a)/ g;'即使在標量上下文中,它也可以返回非布爾值的東西。例如'my $ num_matches = $ s =〜s/a/b/g;'例如'my $ new = $ old =〜s/a/b/gr;' – ikegami 2012-04-10 19:51:25

2

綁定運算符只是「綁定」一個目標變量給其中一個運算符。它不會影響價值。替代運算符s///通常會更改目標值並返回它所作的替換次數。

my $count = $target =~ s/.../.../; 
my $count = ($target =~ s/.../.../); # same thing, clarified with() 

用Perl v5.14開始,有一個爲單獨離開目標值的替代運營商/r標誌,並且,而不是返回計數,返回修改後的值:

my $modified = $target =~ s/.../.../r;