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