我見過很多使用$/
在Internet上使用的Internet上的例子,但是我不明白這個用法。
能否請你解釋一下,我們如何在Perl中使用$/
而不是split
?
我見過很多使用$/
在Internet上使用的Internet上的例子,但是我不明白這個用法。
能否請你解釋一下,我們如何在Perl中使用$/
而不是split
?
從Perl的文檔
$ /和$ \其分別輸入和輸出記錄分隔符 。當你讀取或寫入數據時,它們控制什麼定義了「記錄」。
默認情況下,使用的分隔符是\n
。 然而,
如果文件中包含,
Lorem ipsum dolor sit amet, --- consectetuer --- adipiscing elit.
定義$/ = "---\n";
,會使隔膜---
而不是\n
並相應地讀入。您在分隔符處「分割」了字符串。
我同意你的看法但是如果我設置了這個變量,那麼當我詢問用戶輸入時,它不會讓我停止輸入值,直到我按下這個變量的值。爲什麼它與此有關? – 2012-07-29 09:54:08
那麼,正如我所說的,'$ /'是**輸入**記錄分隔符。 Perl沒有意識到記錄已經結束,直到它與該令牌一起呈現。默認情況下,它是換行符。 – 2012-07-29 09:55:15
@PrashantTiwari:鍵盤緩衝與$ /'變量無關。在正常情況下,當您要求操作系統從鍵盤讀取數據時,只有按下Enter鍵時纔會返回一個值。在從系統的輸入接收到Perl數據之前,Perl不能將數據傳遞給您的程序,並且'$ /'的默認值爲換行符是巧合。如果你把它設置爲別的東西,那麼你的程序仍然會等待,直到按下Enter鍵,但是輸入中的字符將以不同的方式分割 – Borodin 2012-07-29 10:32:42
不知道你在說什麼的例子,但有人可能會認爲,
my @lines = split $/, $very_long_string;
類似於啜文件到一個數組,如
my @lines = <$FILE>;
雖然這並不完全相同,但split
的第一個參數是一個正則表達式,而$/
僅被解釋爲字符串。對於默認值$/
,沒有區別,但將其設置爲例如.
應顯示差異。
如果在標量環境下使用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
是閱讀文件的最佳方式,應該是您的第一選擇,除非您有一個壓倒性的理由,您爲什麼需要不同的東西。它將防止奢侈的內存使用,並通過強迫您一次專注於單個數據記錄來鼓勵更好的編程。
你能發表一個你不明白的例子嗎?文檔(http://perldoc.perl.org/perlvar.html)非常清晰。 – Mat 2012-07-29 09:46:39