2012-07-29 56 views
4

我見過很多使用$/在Internet上使用的Internet上的例子,但是我不明白這個用法。

能否請你解釋一下,我們如何在Perl中使用$/而不是split

+5

你能發表一個你不明白的例子嗎?文檔(http://perldoc.perl.org/perlvar.html)非常清晰。 – Mat 2012-07-29 09:46:39

回答

2

從Perl的文檔

$ /和$ \其分別輸入和輸出記錄分隔符 。當你讀取或寫入數據時,它們控制什麼定義了「記錄」。

默認情況下,使用的分隔符是\n。 然而,

如果文件中包含,

Lorem ipsum dolor sit amet, --- consectetuer --- adipiscing elit. 

定義$/ = "---\n";,會使隔膜---而不是\n並相應地讀入。您在分隔符處「分割」了字符串。

(Reference)

+0

我同意你的看法但是如果我設置了這個變量,那麼當我詢問用戶輸入時,它不會讓我停止輸入值,直到我按下這個變量的值。爲什麼它與此有關? – 2012-07-29 09:54:08

+1

那麼,正如我所說的,'$ /'是**輸入**記錄分隔符。 Perl沒有意識到記錄已經結束,直到它與該令牌一起呈現。默認情況下,它是換行符。 – 2012-07-29 09:55:15

+2

@PrashantTiwari:鍵盤緩衝與$ /'變量無關。在正常情況下,當您要求操作系統從鍵盤讀取數據時,只有按下Enter鍵時纔會返回一個值。在從系統的輸入接收到Perl數據之前,Perl不能將數據傳遞給您的程序,並且'$ /'的默認值爲換行符是巧合。如果你把它設置爲別的東西,那麼你的程序仍然會等待,直到按下Enter鍵,但是輸入中的字符將以不同的方式分割 – Borodin 2012-07-29 10:32:42

2

不知道你在說什麼的例子,但有人可能會認爲,

my @lines = split $/, $very_long_string; 

類似於啜文件到一個數組,如

my @lines = <$FILE>; 

雖然這並不完全相同,但split的第一個參數是一個正則表達式,而$/僅被解釋爲字符串。對於默認值$/,沒有區別,但將其設置爲例如.應顯示差異。

7

如果在標量環境下使用readline $filehandle(或<$filehandle>),它會返回該文件的未讀部分的剩餘部分直至幷包括字符串的$/下一次出現。默認情況下,它被設置爲換行符,因此文件的下一行被返回。

my $line = <$filehandle> 

while (<$filehandle>) { ... } 

兩者施加標量上下文,因此該變量被設置爲文件的下一行,並且該環與所述文件的一行,在一時間在$_變量執行。

如果文件中的數據單元延伸到多行,有時可能會更改$/的值。例如,如果文件包含的塊總是在行尾以}結尾,那麼您可以設置$/ = "}\n"。然後你會得到一切,直到返回的塊的下一個結束,可能嵌入換行符。

$/有幾個特殊值。將它設置爲空字符串$/ = ''將使Perl返回一切,直到文件中有一個或多個空行。顯然這隻有在你的文件中的數據被分隔成空行的單元時纔有用。

設置$/undef將允許讀取繼續直到文件結尾。這是什麼意思sl 012該文件到內存中,有時對於小文件很實用。如果它是絕對必要的它使用一個小代碼塊的範圍內local

my $data = do { 
    open my $filehandle, '<', 'file.txt' or die $!; 
    local $/; 
    <$filehandle>; 
}; 

設置$/參考數值將強制讀取字符的具體數量後停止做得最好。例如$/ = \4096將使readline爲您從文件中提取下一個4KB的數據(或者如果剩餘的文件少於4KB,則文件的其餘部分)。這可以用於緩存自己的文件讀取等特殊用途。

作者:「使用$/ in Perl over split」我想你是指在整個文件中使用split變成標量變量的區別。主要考慮的是內存空間。如果文件大於幾KB,那麼如果不是完全必要的話,將它全部讀入Perl變量是非常浪費的。使用$/while將一次只允許一條記錄讀入內存,在讀取下一條記錄時進行處理和丟棄。

如果你認爲你需要的所有文件的一個數組,這樣就可以向後看以及前鋒,例如,你應該考慮Tie::File模塊,這將使它出現如果整個文件是爲一個數組(甚至可以修改它),但實際上會根據需要將數據分爲內存和外存。

使用split的優點是需要regualr表達式來標識拆分字符串的位置。這與$/相反,它只能設置爲簡單的字符串。如果您需要以更復雜的方式分割文件,這可能很有用。

一般來說,使用$/連同while是閱讀文件的最佳方式,應該是您的第一選擇,除非您有一個壓倒性的理由,您爲什麼需要不同的東西。它將防止奢侈的內存使用,並通過強迫您一次專注於單個數據記錄來鼓勵更好的編程。