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