輸入記錄分隔符號,預設為換行。這會影響 Perl 對於「一行」的定義。運作方式類似 awk 的 RS 變數,包括將空行視為終結符號(空行不能包含任何空格或 tab)。您可以設定為多字元字串,以符合多字元終結符號,或設定為 undef
以讀取至檔案結尾。如果檔案包含連續的空行,設定為 "\n\n"
的意義會與設定為 ""
略有不同。設定為 ""
會將兩個或更多連續的空行視為單一空行。設定為 "\n\n"
會盲目假設下一個輸入字元屬於下一個段落,即使它是換行。
local $/; # enable "slurp" mode
local $_ = <FH>; # whole file now here
s/\n[ \t]+/ /g;
請記住:$/
的值是字串,不是正規表示式。awk 一定有某些地方比較好。 :-)
設定 $/
為空字串(所謂的段落模式)值得特別注意。當 $/
設定為 ""
且整個檔案以該設定讀取時,檔案開頭任何連續一個或多個換行符號的序列都會被捨棄。除了檔案中的最後一個記錄外,每個以兩個或多個換行符號結尾的字元序列都會被視為一個記錄,並讀取為以兩個換行符號結尾。如果檔案中的最後一個記錄以零或一個連續換行符號結尾,則該記錄會以該數量的換行符號讀取。如果最後一個記錄以兩個或多個連續換行符號結尾,則它會像所有前一個記錄一樣以兩個換行符號讀取。
假設我們將下列字串寫入檔案
my $string = "\n\n\n";
$string .= "alpha beta\ngamma delta\n\n\n";
$string .= "epsilon zeta eta\n\n";
$string .= "theta\n";
my $file = 'simple_file.txt';
open my $OUT, '>', $file or die;
print $OUT $string;
close $OUT or die;
現在我們以段落模式讀取該檔案
local $/ = ""; # paragraph mode
open my $IN, '<', $file or die;
my @records = <$IN>;
close $IN or die;
@records
將包含這 3 個字串
(
"alpha beta\ngamma delta\n\n",
"epsilon zeta eta\n\n",
"theta\n",
)
將 $/
設定為整數、包含整數的純量或可轉換為整數的純量的參考,將嘗試讀取記錄而非行,其中最大記錄大小為參考整數數量的字元。因此
local $/ = \32768; # or \"32768", or \$var_containing_32768
open my $fh, "<", $myfile or die $!;
local $_ = <$fh>;
將從 $fh 讀取不超過 32768 個字元的記錄。如果您不是從面向記錄的檔案讀取(或您的作業系統沒有面向記錄的檔案),則每次讀取時可能會取得完整資料區塊。如果記錄大於您設定的記錄大小,您將會分批取得記錄。嘗試將記錄大小設定為零或更小已不建議,且會導致 $/ 的值為「undef」,這將導致讀取整個檔案(的其餘部分)。
從 5.19.9 開始,將 $/
設定為任何其他形式的參考將會擲出致命例外。這是為了準備未來支援設定 $/
的新方法。
僅在 VMS 上,記錄讀取會繞過 PerlIO 層和任何相關緩衝,因此您不得在同一個檔案處理器上混合記錄和非記錄讀取。記錄模式僅在兩種模式使用相同的緩衝層時與行模式混合。
您無法在處理器上呼叫 input_record_separator()
,只能作為靜態方法呼叫。請參閱 IO::Handle。
另請參閱 perlport 中的 「換行符號」。另請參閱 "$."。
助記符:引用詩歌時,/ 用於區分行界。