zoukankan      html  css  js  c++  java
  • 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
    ";
    

    执行:

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

    read返回所读取到的字节数,如果读取时已经到了文件尾部,则返回0,如果read出错了则返回undef。所以,循环read的时候,可以通过下面的代码来判断是否到了文件尾部或出错。具体可见下面四参数循环read的示例用法。

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

    四参数的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
    ";
    }
    
    if(not defined $res){
        print "Error: $!
    ";
    } else {
        print "read Over
    ";
    }
    
    __DATA__
    abcdefg ABCDEFG
    hijklmn HIJKLMN
    bye
    

    由于可以通过offset指定从哪里开始写数据,所以当前的变量长度可能比offset的值更小,这时将自动使用(即空字符)填充到指定长度以便追加数据。如果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
    ";
    }
    
    __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
    
  • 相关阅读:
    Asp.net全局资源文件( App_GlobalResources)和本地资源文件(App_LocalResources)
    基于bootstrap3.3.4的简单框架搭建(左侧导航收起滚动)
    jquery file upload + asp.net 异步多文件上传
    写给若干年后的自己
    There is already an open DataReader associated with this Connection which must be closed first EF
    我,一个传统男人的22岁
    错误 137 (net::ERR_NAME_RESOLUTION_FAILED):未知错误
    Android APK反编译详解(附图)
    string的连接字符串方法及效率
    腾讯QQ API接口调用 之QQ状态查询
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/10442188.html
Copyright © 2011-2022 走看看