目前还没介绍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( <DATA> ) { ... }
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中读取数据。

现在可以向这个文件句柄中输出一些数据,它们会存储到$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 1250
malongshuai small 910
gaoxiaofang big 1250
gaoxiaofang small 450
tuner middle 1218
wugui middle 199

如下:

use v5.10; # for state
while( <> ) {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";
}

Perl文件句柄引用相关推荐

  1. PERL 文件句柄||readline() on closed filehandle FILE ||Can't open file 解决方法

    perl 文件句柄 *Perl readline() on closed filehandle FILE 或Can't open file 问题解决方案 ) perl 读取一个文件,然后把读出来的数据 ...

  2. perl 数组引用_Perl中数组引用的魔力

    perl 数组引用 在编程世界中,如果不遇到嵌套的数据结构,您将走得很远. 例如,JavaScript对象可能如下所示: var cats = { "name":"Mr. ...

  3. perl数组硬引用_带有哈希引用的Perl数组引用(Perl Array Reference with hash reference)

    带有哈希引用的Perl数组引用(Perl Array Reference with hash reference) my $var1=[{'a'=>'1','b'=>'2'},1]; pr ...

  4. Perl -- 数组引用

    1.用多个数组来完成一个简单任务 在Minnow开始一个旅程之前(比如一个三小时的远足), 我们应该事先检查一下每个乘客和乘务人员的行李,保证他们带了旅行所需要的东西.比如说吧,水上安全救生装备.在M ...

  5. Perl 教学 Perl5中的引用(指针)

    一.引用简介    引用就是指针,可以指向变量.数组.哈希表(也叫关联数组)甚至子程序.Pascal或C程序员应该对引用(即指针)的概念很熟悉,引用就是某值的地址,对其的使用则取决于程序员和语言的规定 ...

  6. [Perl系列—] 2. Perl 中的引用用法

    Perl 中的引用,为什么要使用引用? 对于熟悉C语言的开发者来说, 指针这个概念一定不陌生. Perl 的引用就是指针,可以指向变量.数组.哈希表甚至子程序. Perl5中的两种Perl引用类型为硬 ...

  7. [Perl系列—] 2. Perl 中的引用使用方法

    Perl 中的引用,为什么要使用引用? 对于熟悉C语言的开发人员来说, 指针这个概念一定不陌生. Perl 的引用就是指针,能够指向变量.数组.哈希表甚至子程序. Perl5中的两种Perl引用类型为 ...

  8. Learning Perl 8

    符号引用 一般来说,类似$$var的结构表示,$var是一个引用变量,而且程序员希望该表达式能够返回$var所指向的值. 假如$var不是引用变量的话会出现什么情况呢?Perl并不是断然打印出错误信息 ...

  9. 符号引用(typeglob,别名)与全局变量的修改

    符号引用(typeglob,别名)与全局变量的修改 不能以为在子函数里修改了一个和全局变量同名的变量就会修改全局变量: #!/usr/bin/perl $glov = "hello" ...

最新文章

  1. css新闻列表优化-突破思维新方法更利于搜索引擎
  2. FreeSWITCH在呼叫失败的情况下如何播放语音提示
  3. java 覆盖和隐藏_Java覆盖和隐藏2
  4. Android网络服务发现(NSD)协议的使用
  5. hiernate的锁机制
  6. 攻击者怎样使用HTML和CSS隐藏“外部发件人”电子邮件警告
  7. MYSQL导出数据出现The MySQL server is running with the --secure-file-priv option so it cannot execute this
  8. c++11 yield函数的使用
  9. 技术应用丨DWS 空间释放(vacuum full) 最佳实践
  10. android备忘录_苹果备忘录怎样把内容置顶?有置顶功能的备忘录便签
  11. 【多任务】如何利用多任务学习提升模型性能?
  12. 运算放大器权威指南(Op Amps for Everyone)
  13. 《QTreeView表项实现排序的2种方式》:系列教程之九
  14. 云原生分布式数据库和数据仓库崛起背后的原因
  15. 巴特沃斯(Butterworth)滤波器 (1)
  16. vue element插件this.$confirm用法(取消也可以发请求)
  17. 超声波测距仪编程_超声波测距详细资料及程序代码
  18. SpringBoot + Vue 结合支付宝支付(1)-- 准备工作
  19. matlab读取mp4视频,【Matlab系列】之视频文件读取和显示的方法
  20. 【Android自动化测试】Robot Framework+adb框架(四)——L2层关键字

热门文章

  1. 电脑上同时安装了tensorflow和tensorflow-gpu,如何默认使用tensorflow-gpu
  2. 关于文件操作的\r\n问题。
  3. Ubuntu20.04安裝QQ for Linux
  4. 概率论-1.2概率的定义及其确定方法
  5. linux程序崩溃时调用链,Linux 获取并分析程序崩溃时的调用堆栈
  6. svn: error while loading shared libraries: libsvn_client-1.so.0
  7. 为您详细解析防火墙的工作原理
  8. csv 中显示逗号和双引号
  9. javascript forEach无法break,使用every代替
  10. Windows命令行参数的知识(一)