到目前为止,我们讨论了读取文件的三种方式:行读取方式,字符读取,每次读取定量字符。
如果一次要读入整个文件,怎么办呢? Perl把这种任务称“吞吃文件”。 在“列表使用场合”下,试用菱形运算符是“吞吃文件”的一种方式。 比如给菱形运算符表达式一个数组,导致菱形运算符读取整个文件,并将其中的每行放入数组中的一个单元。 “吞吃文件”的另一种方式是更改特殊变量$/中的值。
$/ 中保存这输入行记录分隔符(它的默认分隔符是\n)。因此,每当菱形运算符用于读取数据时,它将一直读取数据,直到它发现与$/一致的字符。所以,如果我们将$/设为 undef ,菱形运算符将读取整个文件并将它们存储在标量中。
提示:
为了完成某个任务而将特殊变量(比如$/)的默认值更改为特殊值,将在后面的程序中导致错误。 请记住,任务完成时,一定要恢复它们的默认值。
无论何时更改$/或其他特殊变量的值,都应该在那个代码块中使用local指令,以便“特殊动作”完成后即可恢复为更改前的值。 这有助于避免难以察觉的错误。
使用更改$/的方法“吞吃文件”:
-------------------------------
#!/usr/bin/perl
use strict;
use warnings;
print "***","$/","---\n";
open(FILE,"$/ = undef; # 此行注掉后,$arr 仅读入a
my $arr = ;
print $arr;
close(FILE);
--------------------------------
程序输出及file.txt的文件内容
[root@dev perl]# ./t
***
---
a
b
c
d
[root@dev perl]# cat file.txt
a
b
c
d
[root@dev perl]#
-------------------------------
*******************************
使用<>“吞吃文件”:
#!/usr/bin/perl
use strict;
use warnings;
print "***","$/","---\n";
open(FILE,"my @arr = ;
print @arr;
close(FILE);
-------------------------------
输出同上。
使用local更改变量"$/":
-------------------------------
#!/usr/bin/perl
use strict;
use warnings;
print "***","$/","---\n";
printfile();
sub printfile {
open(FILE,"local $/ = undef;
my $arr = ;
print $arr;
close(FILE);
print "***","$/","---\n";
}
print "***","$/","---\n";
------------------------------
阅读(1690) | 评论(0) | 转发(0) |