對應的官方手冊:http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandleshtml
默認狀況下:python
$/
:輸入行的分隔符以換行符爲單位,可使用$/
指定$\
:print輸出行的分隔符爲undef,可使用$\
指定,例如指定換行符"\n"$,
:print輸出列表(也就是每一個逗號分隔的部分)的字段分隔符爲undef,可使用$,
指定,例如指定空格$"
:默認在雙引號上下文中,數組被輸出的時候是使用空格做爲分隔符的,可使用$"
指定列表分隔符$.
:當前處理到的行號$.
。它是一個行號計數器。文件句柄關閉時會重置行號
<>
從不會顯式關閉文件句柄,因此從命令行ARGV讀取的文件行號會不斷增長$ARGV
:表示當前處理的命令行參數中的文件,注意區分:
@ARGV
表示命令行參數$ARGV[N]
表示的是@ARGV
數組中的某個元素$ARGV
是命令行參數中各文件列表,perl當前正在處理的文件$|
:控制寫入或輸出數據時是否先放進緩衝再刷入文件句柄
注意:輸出的分隔符只適用於print,不適用say。shell
例如:數組
1.指定輸出行分隔符$\
。這樣每次輸出的時候,會自動在輸出語句的尾部加上這個分隔符。能夠指定多個字符做爲分隔符。緩存
{ my $\ = "\n"; print "new line1"; print "new line2"; print "new line3"; # 能夠指定多個字符:$\ = "YYY" }
上面將換行輸出各行。測試
2.指定輸出字段分隔符$,
。這樣print語句中每一個逗號隔開的地方都會按照指定的分隔符輸出。命令行
{ my $,="-"; print "new field1","new field2","new field3","\n"; # 能夠指定多個字符:$, = "YYY" }
上面將輸出:new field1-new field2-new field3
code
3.數組輸出字段分隔符$"
。當print的輸出列表中有數組,且數組使用雙引號包圍的時候(即雙引號上下文中數組替換),默認數組元素是使用空格分隔的,該分隔符指定元素之間的分隔符。htm
#!/usr/bin/perl { $"="x"; @arr=qw{perl python shell}; print "@arr","\n"; }
上面將輸出:"perlxpythonxshell"。blog
4.$.
表示當前處理到的行號。文件句柄關閉時會重置行號,但從新打開文件句柄時不會重置。但因爲讀取文件的輸入符號<>
從不會顯式關閉文件句柄,因此ARGV讀取的文件行號會不斷增長。
#!/usr/bin/perl # 打開文件,看行號 open LOG1,"<","test.log"; while(<LOG1>){ print "Line $.: $_"; } print "---------------------\n"; close LOG1; # 關閉上面的文件句柄後,再打開一次文件句柄,行號重置 open LOG2,"<","test.log"; while(<LOG2>){ print "Line $.: $_"; } print "---------------------\n"; close LOG2; # 從<>讀內容,行號一直變大 while(<>){ print "Line $. from $ARGV: $_"; }
5.$/
控制的是輸入行分隔符。在讀取文件的時候,經過該特殊變量能夠控制如何分行。
例如,如下是test1.log文件的內容:
a b x c d x e
如下是15.plx的源代碼:
$/="x"; while(<>){ print "Line $.: $_","\n"; }
執行的結果:
注意換行符"x"也會保留在行中。
常常地,想要在源碼文件裏讀取一些文件數據來進行測試,這時能夠直接使用一個預約義的僞文件句柄DATA。
... some code ... 從__DATA__或__END__開始的數據都將被DATA文件句柄讀取,直到文件結尾 __DATA__ ...一些待讀取數據...
當perl編譯器遇到__DATA__
或__END__
了,就意味着代碼到此結束,下面的數據都將做爲當前文件內有效的DATA文件句柄的數據流。
例如:
#!/usr/bin/perl while(<DATA>){ chomp; print "read from DATA: $_\n"; } __DATA__ first line in DATA second line in DATA third line in DATA last line in DATA
DATA僞文件句柄的一個缺點是從遇到__DATA__
或__END__
起直到文件的尾部,都屬於DATA文件句柄的內容,也就是說在源代碼文件中只能定義一個僞文件句柄。
在CPAN上有一個Inline::Files
模塊,它能夠在同一個源代碼文件中定義多個僞文件句柄。須要先安裝:
cpan install Inline::Files
例如:
use Inline::Files; use 5.010; say "@main::FILE1"; say "@main::FILE2"; while(<FILE1>){ say "$_"; } while(<FILE2>){ say "$_"; } __FILE1__ first line in FILE1 second line in FILE1 third line in FILE1 __FILE2__ first line in FILE2 second line in FILE2 third line in FILE2
它像ARGV同樣,在運行程序初始階段就打開這些虛擬文件句柄,並將每一個虛擬文件句柄保存到@<PACKNAME>::<HANDLE>
中。例如,上面的是示例是在main包中定義了FILE1和FILE2兩個文件句柄,那麼這兩個文件句柄將保存到@main::FILE1
和@main::FILE2
中,並在處理某個文件句柄的時候,將其保存到標量$main::FILE1
或$main::FILE2
中。
能夠同時定義多個名稱相同的虛擬文件系統。例如:
__FILE1__ ... __FILE2__ ... __FILE1__ ...
這時在@<packname>::FILE1
數組中就保存了兩個元素,當處理第二個FILE1的時候,將自動從新打開這個文件句柄。
通常來講,這些就夠了,更多詳細的用法請參見官方手冊:Inline::Files。