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

Perl IO:read()函数的更多相关文章

  1. Perl IO:操作系统层次的IO

    sysopen() open()和sysopen()都打开文件句柄,open()是比较高层次的打开文件句柄,sysopen()相对要底层一点.但它们打开的文件句柄并没有区别,只不过sysopen()有 ...

  2. Perl IO:IO重定向

    文件句柄和文件描述符的关系 文件描述符是操作系统的资源,对于实体文件来说,每打开一次文件,操作系统都会为该进程分配一个文件描述符来关联(指向)这个文件,以后操作文件数据都根据这个文件描述符来操作,而不 ...

  3. Perl IO:简介和常用IO模块

    三篇Perl IO基础类文章: Perl的IO操作(1):文件句柄 Perl的IO操作(2):更多文件句柄的模式 Perl文件句柄相关的常见变量 IO对象和IO::Module家族模块 无论是哪种高级 ...

  4. perl的map函数

    perl的map函数的使用: 语法 map EXPR, LIST map BLOCK LIST 定义和使用 对list中的每个元素执行EXPR或BLOCK,返回新的list.对每一此迭代,$_中保存了 ...

  5. 【Perl学习笔记】1.perl的ref 函数

    perl有引用的概念:一组数据实际上是另一组数据的引用.这些引用称为指针,第一组数据中存放的是第二组数据的头地址.引用的方式被用得相当普遍,特别是在面向对象的模块.函数的参数传递等常见.但perl对每 ...

  6. openssl之BIO系列之6---BIO的IO操作函数

    BIO的IO操作函数     ---依据openssl doc/crypto/bio/bio_read.pod翻译和自己的理解写成          (作者:DragonKing Mail:wzhah ...

  7. Perl字符串处理函数用法集锦

    Perl字符串处理函数 0.函数名 index 调用语法position=index(string,substring,position); 解说返回子串substring在字符串string中的位置 ...

  8. perl中sprintf函数的用法

    对于某些字符串,需要输入为特定的格式,通过sprintf可以很方便的完成,不需要专门进行其他处理. 转载 perl中sprintf函数的使用方法.

  9. Perl IO:随机读写文件

    随机读写 如果一个文件句柄是指向一个实体文件的,那么就可以对它进行随机数据的访问(包括随机读.写),随机访问表示可以读取文件中的任何一部分数据或者向文件中的任何一个位置处写入数据.实现这种随机读写的功 ...

随机推荐

  1. js活jQuery实现动态添加、移除css/js文件

    下面是在项目中用到的,直接封装好的函数,拿去在js中直接调用就可以实现css.js文件的动态引入与删除.代码如下 动态加载,移除,替换css/js文件 // 动态添加css文件 function ad ...

  2. VS之设置文件编码格式

    VS2012默认格式为 "GB2312-80",很多时候可能出现乱码情况,就是编码问题,如何在VS里修改呢? 文件->“高级保存选项 ”  选择gb2312

  3. 小飞机ss端口被占用处理

    如图所示: 解决方法: 1.运行cmd 2.输入命令:netstat -aon|findstr "1080" 3.获取使用该端口的PID---“8540”,如下图所示: 4.输入命 ...

  4. Scanner,Random,匿名对象-------------------java基础学习第七天

    1.API 2.Scanner 功能:通过键盘输入数据到程序中. 引用类型的一般使用步骤: 导包 Import 包路径.类名称 只有java.lang 包写的类不需要导包,其他都需要 2.创建 类名称 ...

  5. JdbcTemplate实体映射

    JdbcTemplate实体映射 如果你需要使用JdbcTemplate将查询的数据映射成Java POJO,那么这篇文章适合你. 一个例子入门 下面是一个将表中一行记录映射成Map的例子,也是Jdb ...

  6. 程序执行流程/布尔类型与布尔:运算猜数字游戏;库的使用:turtle

    myPrice = 6 while True: guess = int(input()) if guess > myPrice: print('>') elif guess < my ...

  7. 关于postgresql group by 报错

    举个例子:     table name:makerar cname  | wmname |          avg            --------+-------------+------ ...

  8. String类,StringBuffer类转字符数组

    String不可变类型和StringBuffer可变类型 String类和StringBuffer类都是字符串表示类,区别在于String对象引用变量是不可变的,而StringBuffer类对象引用变 ...

  9. java并发面试

    1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...

  10. 平衡二叉树(AVL)介绍及其实现

    一.平衡二叉树 任何一个数据的查找过程都需要从根结点出发,沿某一个路径朝叶子结点前进.因此查找中数据比较次数与树的形态密切相关. 对于二叉树来说,当树中每个结点左右子树高度大致相同时,树高为logN. ...