Perl文件句柄相關常量變量

文件句柄相關變量

對應的官方手冊:http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandleshtml

默認狀況下:python

  • $/:輸入行的分隔符以換行符爲單位,可使用$/指定
  • $\:print輸出行的分隔符爲undef,可使用$\指定,例如指定換行符"\n"
  • $,:print輸出列表(也就是每一個逗號分隔的部分)的字段分隔符爲undef,可使用$,指定,例如指定空格
  • $":默認在雙引號上下文中,數組被輸出的時候是使用空格做爲分隔符的,可使用$"指定列表分隔符
  • $.:當前處理到的行號$.。它是一個行號計數器。文件句柄關閉時會重置行號
    • 因爲讀取文件的輸入符號<>從不會顯式關閉文件句柄,因此從命令行ARGV讀取的文件行號會不斷增長
  • $ARGV:表示當前處理的命令行參數中的文件,注意區分:
    • @ARGV表示命令行參數
    • $ARGV[N]表示的是@ARGV數組中的某個元素
    • $ARGV是命令行參數中各文件列表,perl當前正在處理的文件
  • $|:控制寫入或輸出數據時是否先放進緩衝再刷入文件句柄
    • 值爲0時,表示先緩存,緩衝了一段數據以後再刷入文件句柄通道
    • 值爲非0時,表示直接刷入文件句柄通道
    • 在使用管道、套接字的時候,建議設置爲非0值,以便數據能馬上被處理
    • 該變量只對寫數據或輸出有效,對讀取操做無效

注意:輸出的分隔符只適用於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 field3code

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

常常地,想要在源碼文件裏讀取一些文件數據來進行測試,這時能夠直接使用一個預約義的僞文件句柄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

Inline::Files

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

相關文章
相關標籤/搜索