2014-10-06 51 views
2

在Perl中,爲什麼有單獨的字符串比較運算符(eq,ne)與數值比較(==,!=)?爲什麼使用兩組獨立的運算符而不是使用單個運算符進行字符串和數字比較?爲什麼Perl有單獨的運算符來測試字符串相等和數字相等?

+1

它有這些運算符,所以它不需要用'==='和'!=='操作符重新發明輪子,這btw不能很好地解決比較問題。 – 2014-10-06 15:12:39

+4

由於數字和字符串比較是不同的操作,因此Perl有不同的數字和字符串比較運算符。更好地問,爲什麼許多其他語言使用一個運算符來處理不同的事情,即使是那些沒有類型系統的運算符也會使它毫不含糊? – hobbs 2014-10-06 15:12:48

+7

簡短回答:**因爲Perl不知道某個值是否爲數字**對Perl來說,數字值'2'可以像存儲爲一個有符號整數的字符串一樣容易地存儲爲字符串。 – ikegami 2014-10-06 15:22:13

回答

3

只要感覺自己需要評估表達式,Perl就會自動進行類型轉換。這需要兩個操作員,以便程序員可以字符串和數值比較區分:

print "eq" if "02" eq "2"; # string comparison -- no output 
print "==" if "02" == "2"; # numeric comparison -- will print "==" 

上面從this thread on PerlMonks服用。下面是該線程的一些其他信息:

  • 一個原因使用==而非eq是這樣,如果你想到哪裏了一些東西非數值使用,你可以得到警告。
  • 使用eq而不是==的一個原因是字符串轉換會丟失小數點後的位數,因此您會因浮點舍入錯誤而導致虛假的不等式。
  • 考慮編寫2 == $val而不是$val == 2。它看起來很奇怪,但這種方式=而不是==常見的拼寫錯誤會給你一個立即編譯錯誤,而不是一個討厭的錯誤。
+0

字符串轉換不會丟失小數位,它們會丟失部分小數位。 – ysth 2014-10-06 16:20:00

+0

(例如,一個53位有效數的64位浮點數可以存儲數字,精度爲15.9位十進制數字,但我們將它串聯到15位十進制數) – ysth 2014-10-06 16:25:18

+0

[警告會在它成爲一個討厭的錯誤之前捕獲到最後一個情況] (https://eval.in/202162),但這是將運行時警告轉換爲編譯時錯誤的一種巧妙方式(代價是稍微少一點的解釋性錯誤消息,其中[省略了錯誤中最顯着的部分] (https://eval.in/202163)('2 =')。 – Slade 2014-10-06 17:15:16

相關問題