Perl 將字串分開可以用 split 這個函數,此函數可以用Regex作分隔判斷,功能滿強大的。
語法
split(/型別/, 字串);
範例
@s= split(/,/, '60,70,80');
也可以把 /,/ 寫成 ',' ,結果是一樣的:
@s= split( ',', '60,70,80');
要注意如果要分格的是一個點 '.' ,例如IP,直接寫會出錯
@s= split( '.', '61.72.38.90');
因為 '.' 在正規表達式中代表「任意一個字元」,所以要加上脫逸字元 '\'
@s= split( '\.', '61.72.38.90');
把每個字母拆開
如果直接用雙斜線來分隔 // 就會每個字元每個字元分開,不過遇到中文會變亂碼,英文和數字沒這個困擾。
$m="AND3 321";
@f = split( //, $m);
print $f[0]; #A
@f = split( //, $m);
print $f[0]; #A
開頭有空白?
把字串用空白分隔的話,會因為開頭是空白而造成困擾。
$m=" dns; program; !slapd ";
@f = split( /\s+/, $m);
print $f[0]; # 空值
@f = split( /\s+/, $m);
print $f[0]; # 空值
這時就要用空白一格的字元 ' ' 來代替 /\s/,因為 perl 對 ' ' 有特別的待遇
@f = split( ' ', $m);
print $f[0]; # dns
print $f[0]; # dns
但是如果想用regex同時也要解決字串前空白的問題的話,就不能兩全其美,只好先用類似 ltrim() 的函數處理掉。但是perl 沒此函數,所以自己寫:
$m =~ s/^\s+//; @f = split( /\s+/, $m); print $f[0]; # dns
結論
1. split 可用正規表達式超方便
2. 用空白一格' '取代\s可忽略字串前空白
3. 自己安trim 的函數也可以 [PERL] 自寫 trim, ltrim, rtrim 函數
原文 2009-11-16