2009-09-17 165 views

回答

3

「模式\ n」 :)

$a = "pattern\n"; 
print "ok 1\n" if $a =~ /^pattern$/; 
print "ok 2\n" if $a eq 'pattern'; 

也許你的意思/ ^模式\ Z /。

+0

Jepp,對 - 這是解決方案 - 它只是一個在我的工作場所的小問題 - 我不是後端編碼器,但我很好奇 - 空白接受是區別:) – user150283 2009-09-19 10:42:23

+0

@chronotype:一般不是空白;特別是一個換行符(「pattern \ n \ n」或「pattern \ t」不匹配)。 $(不含/ m)匹配字符串的結尾或緊跟在字符串末尾的換行符之前。 – ysth 2009-09-21 03:35:23

24

eq是測試字符串相等,==是同樣的事情,但對於數值相等。

=~運算符用於將正則表達式應用於標量。

有關每個Perl運算符的細節以及它們的用途,請參見perldoc perlop聯機幫助頁。

+2

除了'perldoc perlop',你還可以在Github上看到'perlopref' - 一項正在進行的工作:http://github.com/cowens/perlopref – Telemachus 2009-09-17 13:20:16

6

eq - 測試字符串相等性。

=~ - 將標量表達式綁定到模式匹配。

請參閱here瞭解更多關於所有操作員的深入描述。

15

正如其他人已經注意到的,($a =~ /^pattern$/)使用正則表達式引擎來評估字符串是否相同,而($a eq 'pattern')是純字符串相等性測試。

如果你真的只想知道兩個字符串是否相同,後者是首選的原因:

  • 可讀性 - 它更簡潔,包含較少的特殊字符。
  • 可維護性 - 使用正則表達式模式,您必須轉義可能出現在字符串中的任何特殊字符,或使用額外的標記,如\Q\E。用單引號字符串,你需要轉義的唯一字符是單引號。 (您也可以逃避反斜槓如果他們緊接着又反斜線或字符串分隔符。)
  • 性能 - 你不承擔發射了正則表達式引擎只是比較字符串的開銷。例如,如果在您的程序中發生了幾百萬次這樣的好處,那麼這個好處是值得注意的。

在另一方面,如果你需要做一些其他比一個普通的字符串相等測試正則表達式的形式表現得更爲靈活。有關正則表達式的更多信息,請參閱perldoc perlre

編輯:ysth先於其他大多數人,我錯過了明顯功能區別它們之間並徑直更抽象的差異。我澄清了這個問題,但我會留下答案作爲(希望)有用的參考。

2

=~是綁定運算符。它用於將值綁定到模式匹配(m//),替換(s///)或音譯(tr//y//)。

eq是字符串相等運算符;它會比較兩個值,以確定它們在被視爲字符串時是否相等。有一個同行==運算符只會將值視爲數字來執行相同的操作。 (在Perl中,字符串和數字大多可以自動轉換,這取決於值的使用方式,因此,如果要比較兩個值,必須指定要執行的比較類型。)

$var =~ m/.../確定$var的值是否與模式匹配,而不是它是否等於特定值。然而,在這種情況下,模式錨定在兩端並且只包含文字字符,所以它相當於字符串比較。這裏最好使用eq,因爲它更清晰快捷。

相關問題