Perl IO:read()函数

read()函数

read()函数用于从文件句柄中读取指定字节数的数据并写入到一个标量中。如果文件句柄是以Unicode方式打开的,则表示读取指定字符数而非字节数。

有两种read方式:

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

三参数的read表示从FH文件句柄中读取len字节长度的数据放进标量变量$var中。四参数的read稍后解释。

例如:

#!/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的示例用法。

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

四参数的read第四个参数则是读取数据后写进变量时从变量的哪个offset开始写,注意offset不是控制从文件句柄的哪个位置读,而是控制向变量的哪个位置开始写。三参数的read是每次都写入到变量的头部。

由于写入到变量中的数据字节数是不定的,可能当前变量中的数据长度比写入的字节长度短、长,这时新的变量将自动扩容或收缩。例如,当前$var="abcde",向其中写入"ABCDEFG"将扩展为7个字节以便存放"FG"这两个字符,向其中写入"ABC"将收缩为3个字符长度。

例如,从一段数据中循环读取数据,并每次读取8个字节保存到变量中。

#!/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

转载于:https://www.cnblogs.com/f-ck-need-u/p/10442188.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PerlIO::via::QuotedPrint是Perl语言中的一个模块,用于在文件读写时对数据进行Quoted-Printable编码和解码。Quoted-Printable是一种用于在ASCII字符集中表示非ASCII字符的编码方式,常用于电子邮件和网络传输中。PerlIO::via::QuotedPrint模块提供了一种方便的方式,可以在文件读写时对数据进行Quoted-Printable编码和解码。 PerlIO::via::QuotedPrint模块的使用方法与其他PerlIO模块类似。可以使用open函数打开一个文件句柄,并指定PerlIO::via::QuotedPrint模块作为过滤器,从而实现对文件数据的编码和解码。 下面是一个使用PerlIO::via::QuotedPrint模块对文件进行Quoted-Printable编码和解码的例子: ``` use PerlIO::via::QuotedPrint; # Quoted-Printable编码 open(my $fh, '>:via(QuotedPrint)', 'file.txt'); print $fh "这是一段中文文本\n"; close($fh); # Quoted-Printable解码 open(my $fh, '<:via(QuotedPrint)', 'file.txt'); while(my $line = <$fh>) { print $line; } close($fh); ``` 在上面的例子中,我们使用了PerlIO::via::QuotedPrint模块对一个文件进行了编码和解码。在第一个open函数中,我们使用了':via(QuotedPrint)'指定了PerlIO::via::QuotedPrint模块作为过滤器,从而将写入文件的数据进行了Quoted-Printable编码。在第二个open函数中,我们同样使用了':via(QuotedPrint)'指定了PerlIO::via::QuotedPrint模块作为过滤器,从而将读取的数据进行了Quoted-Printable解码。 使用PerlIO::via::QuotedPrint模块可以方便地对文件数据进行Quoted-Printable编码和解码,从而满足不同应用场景中对数据编码的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值