博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Perl文件句柄引用
阅读量:4963 次
发布时间:2019-06-12

本文共 2250 字,大约阅读时间需要 7 分钟。

目前还没介绍Perl的面向对象,所以这节内容除了几个注意点,没什么可讲的。

以前经常使用大写字母的句柄方式(即所谓的裸字文件句柄,bareword filehandle),现在可以考虑转向使用变量文件句柄的形式,因为只有使用变量句柄的方式,才能创建文件句柄引用。

open DATA,">>","/tmp/a.log" or die "can't open file: $!";open my $data_fh ,">>","/tmp/a.log" or die "can't open file: $!";open my $fh, '<', 'castaways.log' or die "Could not open castaways.log: $!";

裸字文件句柄和变量文件句柄用法是完全一致的,能用裸字文件句柄的地方都可以替换为变量文件句柄:

while(  ) { ... }while( <$log_fh> ) { ... }

不管使用裸字还是变量文件句柄的方式,在退出文件句柄所在作用域的时候,都会自动关闭文件句柄,无需手动close。

只是需要注意的是,使用变量文件句柄的方式,在say/print输出的时候,指定文件句柄时需要使用大括号包围,以免产生歧义:

print {$data_fh} "your output content";

如果想要让某个函数指定输出的文件句柄,也简单,只需将文件句柄作为一个参数即可:

log_message( $log_fh, 'My name is Mr. Ed' );sub log_message {    my $fh = shift;    print $fh @_, "\n";}

字符串句柄

除了可以将句柄关联到文件(open)、管道、套接字、目录(opendir),还可以将句柄关联到字符串。也就是将一个变量作为文件句柄的关联对象,从这个变量读或从这个变量写。

例如:

open my $string_fh, '>>', \my $string;open my $string_fh, '<', \$multiline_string;

上面第一句声明了一个词法变量$string(初始化为Undef),同时创建了一个文件句柄$string_fh,这个文件句柄的输出对象是词法变量$string指向的数据对象。第二句则是从字符串$multiline_string中读取数据。

733013-20181003134643242-380827293.png

现在可以向这个文件句柄中输出一些数据,它们会存储到$string中:

#!/usr/bin/perlopen my $string_fh, ">>",\my $string or die "...$!";print {$string_fh} "first line\n";print {$string_fh} "second line";print $string,"\n";   # 输出两行:first line和second line

如果想将流向标准输出STDOUT默认设备(终端屏幕)的内容改输出到字符串中,需要小心一些,因为STDOUT毕竟是标准输出,程序的很多部分可能都需要使用它。所以,尽量在一小片范围内修改标准输出的目标。例如,使用大括号包围,并将STDOUT进行local化(裸字文件句柄只能用local修饰):

print "1. This goes to the real standard output\n";my $string;{    local *STDOUT;    open STDOUT, '>', \ $string;    print "2. This goes to the string\n";    $some_obj->noisy_method();   # this STDOUT goes to $string too}print "3. This goes to the real standard output\n";

文件句柄容器

说法有点高大上,其实就是将文件句柄存储到数据结构中(例如hash、数组),做一个装文件句柄的容器。

例如,有一个文件a.txt,内容如下。现在想将每一行第二列、第三列存储到以第一列命名的变量中。

malongshuai big 1250malongshuai small 910gaoxiaofang big 1250gaoxiaofang small 450tuner middle 1218wugui middle 199

如下:

use v5.10; # for statewhile( <> ) {    state $fhs;   # 定义一个hash引用变量    my( $source, $destination, $bytes ) = split;    unless( $fhs->{$source} ) {  # 当hash键(第一列)不存在时,创建字符串句柄        open my $fh, '>>', $source or die '...';        $fhs->{$source} = $fh;    }    say { $fhs->{$source} } "$destination $bytes";}

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

你可能感兴趣的文章
python代码格式规范
查看>>
IOS获取系统相簿里的照片
查看>>
OS开发UI篇—无限轮播(功能完善)
查看>>
[模板]数学整合
查看>>
不受控制的 position:fixed
查看>>
safari的坑
查看>>
awk根据指定的字符串分割字符串
查看>>
ubuntu下apt-get的配置文件是哪个
查看>>
[九省联考2018]一双木棋chess
查看>>
6.循环
查看>>
tp3.2 自带的文件上传及生成缩略图功能
查看>>
Angular 入门学习
查看>>
[单选题]条件语句的时候不应该使用哪一种控制结构
查看>>
1049 I Think I Need a Houseboat ACM题答案 java版
查看>>
socket tcp
查看>>
散列表(一).散列表基本内容介绍
查看>>
11-2犀牛读书笔记
查看>>
Openjudge 1.12-04
查看>>
elementUI-事件绑定Bug
查看>>
我的asp.net core目录
查看>>