2010-09-14 80 views
21

我注意到Perl的split命令有些奇怪的行爲,尤其是在我期望得到的數組包含空字符串''的情況下,但實際上並沒有。例如,如果在字符串的結尾(或開頭)有一個分隔符,則結果數組沒有作爲最後一個(或第一個)元素的空字符串「s」。在分隔符之前/之後用空文本分割Perl

實施例:

@s = split(/x/, 'axb') 

產生2元件陣列[ '一', 'B']

@s = split(/x/, 'axbx') 

產生同一陣列

@s = split(/x/, 'axbxxxx') 

產生同一陣列

但是,一旦我把一些東西噸結束時,所有那些空字符串不顯示爲元素:

@s = split(/x/, 'axbxxxxc') 

產生6元件陣列[ 'A', 'B', '', '', '', 'C']

如果分隔符處於開始位置,則行爲相似。

我希望在分隔符之間,分隔符之前或分隔符後總是產生分隔符中的元素。任何人都可以向我解釋爲什麼Perl在Perl中的行爲如此嗎?我只是在Python中嘗試了同樣的事情,它按預期工作。

注:Perl的V5.8

回答

44

the documentation

默認情況下,空領先的字段保存,空尾隨的被刪除。 (如果所有字段都爲空,則認爲它們是尾隨的。)

這解釋了您在尾部字段中看到的行爲。這通常是有道理的,因爲例如人們通常非常不注意拖尾空白。但是,如果你願意,你可以得到尾隨空白字段:

split /PATTERN/,EXPR,LIMIT

如果limit是負數,因爲如果指定了一個任意大的限制已經被處理。

因此,要獲得所有尾隨空字段:

@s = split(/x/, 'axbxxxxc', -1); 

(我假設在看空的主要字段時,你犯了一個粗心的錯誤 - 他們肯定會保留嘗試split(/x/, 'xaxbxxxx')結果有大小。 3.)

+4

從文檔引用時,請包含相關文檔的鏈接。這次我爲你添加了它。 – cjm 2010-09-14 18:48:49

+0

哇,我覺得很愚蠢,不直接去看文檔。是的,你是對的,我在測試領先空間時一定犯了一些粗心的錯誤,只是再次嘗試並發現它們被保留下來。感謝關於放入-1的限制的說明,這幫助我解決了問題! – Roman 2010-09-14 19:02:12

+0

@cjm謝謝;我保證我通常會這樣做! – Cascabel 2010-09-14 21:55:11