看上去很久都沒有寫部落格了。其中有兩個原因,第一是實在沒有時間(無奈),第二是感覺沒有碰到需要寫下來的東西,今天碰到 perl 中的字串標量,讓我覺得有寫下來的必要。
都說 perl 醜,寫出來的**幾個月後自己都不認識,在 perl 中,確實有許多奇奇怪怪的語法,比如 perl 中字串與數字標量之間的隱式的轉換。比如看下面乙個例子:
"2perl" * 3
用慣性思維猜一下裡面的值是多少呢?是會丟擲執行時異常嗎?還是執行下去是無法解釋的值。啊,都不是,是 6。
perl 在解釋到這個字串的時候,發現它做了乙個*
的運算操作,於是嘗試把它轉換成數字標量,轉換的規則很簡單,也有點奇怪,當前面是數字後面是字元時,這時候會把遇到的第乙個字元的下標作為起點,往後直到字串的尾部全部截去不管,於是2perl
轉換為數字標量是 2,於是結果就是 6 了。
如果把目標字串換成perl2
,perl 的直譯器發現首先遇到的是字元,那就直接轉換為 0 了,於是
"perl2" * 3
上面的結果為 0。
這兩個東西在不同語言中有不同的含義,這些都留給對應的編譯器/直譯器來解釋吧!
在 perl 中,單引號沒有強大的轉**析,適合你只想輸出純淨的字串的場景,比如
print 'hello\n'; # hello\n%
你會發現真的列印了"hello\n"
,\n
並沒有被轉義。
雙引號與單引號相反,它有強大的轉**析,對\
反斜槓有特殊的含義,與此同時,它還能作為模版字串來使用
$msg = 'hello';
print "$msg\n"; # hello
發現輸出的是hello
與此同時perl
的字串標量還有一些實用但是可能平時不怎麼會注意的操作符
類似於其他語言中 string 的 concat,但是語義不是那麼的強,但是卻很好用
'hello' . 'world' # helloworld
很多時候會需要遇到需要 repeat 字串的時候
'hello' x 3 # hellohellohello
perl 中的字串比較是不能用==
,<=
,=<
來做邏輯運算的,而是要用gt
,lt
,eq
來做判斷,但是我們不妨試一試用==
,<=
,=<
到底比較的是什麼
$str1 = "hello";
$str2 = "world";
if($str1 == $str2) else
發現輸出的永遠是equals
這是為什麼呢?
考慮==
,<=
,=<
是數字標量的操作符,因此這裡會有乙個隱式的型別轉換,嘗試把字串轉為數字標量,還記得開頭的轉換規則嗎,這裡全都會轉換為 0,於是進入 true 分支
所以用==
,<=
,=<
來做字串的比較是很不安全的。
perl 字串操作
字串陣列元素賦值 tmp qw aaa bbb kkk 9000 相當於 tmp aaa bbb kkk 9000 字串比較,絕不能用 要用eq macg localhost perltest vi tip.pl usr bin perl print input while chomp input ...
perl對字串的處理
perl對字串的處理 當我們對字串其中的某部分做截出,替換,刪除 不包括搜尋 我們可以想到的用substr,unpack,regex這些方法來做。如果搜尋,那麼讓我們想到的是index,rindex.1 截出 substr str i m boy,and you?substr str,4,3 boy...
NOIP 模擬題 奇怪的字串
題目描述 有一天,小 a 的女票為了讓小 a 證明他對她的忠誠,要求小 a 生成乙個長度 為 n 的 全由小寫英文本母構成的字串,只能使用 k 種字母。要求滿足 字串中相鄰的兩個字母不能相同。必須出現恰好 k 種不同的字母。這樣的合法字串可能有很多,小 a 的女票要求小 a 輸出字典序最小的那個。小...