Perl IO:read()函數

read()函數

read()函數用於從文件句柄中讀取指定字節數的數據並寫入到一個標量中。若是文件句柄是以Unicode方式打開的,則表示讀取指定字符數而非字節數。函數

有兩種read方式:code

read FH, $var, len
read FH, $var, len, offset

三參數的read表示從FH文件句柄中讀取len字節長度的數據放進標量變量$var中。四參數的read稍後解釋。it

例如:變量

#!/usr/bin/perl
use strict;
use warnings;

# 打開標準輸入
open my $fh, "<-" or die "open failed: $!";

my $var;
my $rd_cnt = read $fh, $var, 8;  # 讀取8個字節到$var

print "$var\n";

執行:擴展

$ echo "hello malongshuai" | perl read.pl -
hello ma

read返回所讀取到的字節數,若是讀取時已經到了文件尾部,則返回0,若是read出錯了則返回undef。因此,循環read的時候,能夠經過下面的代碼來判斷是否到了文件尾部或出錯。具體可見下面四參數循環read的示例用法。perl

if(not defined $res){
    print "Error: $!\n";
}else {
    print "read Over\n";
}

四參數的read第四個參數則是讀取數據後寫進變量時從變量的哪一個offset開始寫,注意offset不是控制從文件句柄的哪一個位置讀,而是控制向變量的哪一個位置開始寫。三參數的read是每次都寫入到變量的頭部。循環

因爲寫入到變量中的數據字節數是不定的,可能當前變量中的數據長度比寫入的字節長度短、長,這時新的變量將自動擴容或收縮。例如,當前$var="abcde",向其中寫入"ABCDEFG"將擴展爲7個字節以便存放"FG"這兩個字符,向其中寫入"ABC"將收縮爲3個字符長度。數據

例如,從一段數據中循環讀取數據,並每次讀取8個字節保存到變量中。di

#!/usr/bin/env perl
use strict;
use warnings;

my $var;
my $res;
while($res = (read DATA, $var, 8, 0)){
    chomp $var;
    print "writed $res bytes to \$var: $var\n";
}

if(not defined $res){
    print "Error: $!\n";
} else {
    print "read Over\n";
}

__DATA__
abcdefg ABCDEFG
hijklmn HIJKLMN
bye

因爲能夠經過offset指定從哪裏開始寫數據,因此當前的變量長度可能比offset的值更小,這時將自動使用\0(即空字符)填充到指定長度以便追加數據。若是offset的值爲負數,則表示從變量的尾部向前計數,-1表示從倒數第一個字節開始追加(覆蓋倒數第一個字節)。文件

#!/usr/bin/env perl
use strict;
use warnings;

# 打開標準輸入
open my $fh, "<-" or die "open failed: $!";

my $var;

# 從標準輸入中讀取數據,並先向$var裏寫入6個字節
read $fh, $var, 6;

my $res;
# 循環寫入,每次從$var中offset=6的位置開始寫入8個字節
# 也就是在變量中追加新讀取的8個字節
while($res = (read DATA, $var, 8, 6)){
    chomp $var;
    print "writed $res bytes to \$var: $var\n";
}

__DATA__
abcdefg ABCDEFG
hijklmn HIJKLMN
bye

執行:

$ echo "hello malong" | perl read1.pl
writed 8 bytes to $var: hello abcdefg
writed 8 bytes to $var: hello ABCDEFG
writed 8 bytes to $var: hello hijklmn
writed 8 bytes to $var: hello HIJKLMN
writed 4 bytes to $var: hello bye
相關文章
相關標籤/搜索