Perl语言IC设计实践
上QQ阅读APP看书,第一时间看更新

2.2 读取文件

要读取文件,可以使用open函数。本书所说的文件,是纯文本文件,而不是二进制文件。先看一个实例:

代码2-1 ch02/open_file.pl

1 #!/usr/local/bin/perl
2 
3 open my $fh_input, '<', "./open_file.pl" or die "read file failed: $!";
4 while ( my $line = <$fh_input> ) {
5   print $line ;
6 }
7 close $fh_input or die "close file failed: $!";
8 
9 exit 0;

请执行一下该程序:

./open file.pl

它将输出整个程序的内容。现在我们逐行说明一下。

第3行,open打开一个文件,并绑定到一个文件句柄(handle),供后续操作使用。文件句柄可理解为指向该文件的内容被读进内存的地址,在这行结束后,这个文件句柄(即$fh_input)指向文本内容的初始位置,即第1行的第1个字符之前的位置。这行语句分成几个部分,open是命令本身,my $fh_input声明了一个局部标量,$fh_input作为文件句柄,<表示后面的文件是作为输入文件被读取(只读)的,./open_file.pl即被读取的文件的文件名,它恰好是程序本身。后面还有or die "…",or是逻辑操作符,它的意义是在左右两个表达式有一个为“真”时,整个表达式的值为“真”;左右两个表达式全为“假”时,整个表达式的值为“假”。Perl中的逻辑操作符都有一个特点,当部分表达式的值已经可以决定整个表达式的值时,不必查看或执行剩余表达式了。我们看一下这个open语句,它在or操作符的左侧作为左侧表达式,当open语句成功时,这个左侧表达式为“真”,那么无论or右侧的表达式是何值,这整个表达式的值都是“真”,所以or右侧的表达式die函数不会被执行。只有当open语句失败,返回“假”时,die函数才会执行。die函数的功能就是输出字符串,然后结束程序。这正是我们想要的,因为多数情况下,一旦读取文件失败,那么后面的代码将失去意义,退出程序并检查代码是更好的选择。$!是一个内建的标量,它会保留最后(最近)一个系统调用所产生的错误信息。如果我们把第3行的文件名修改为一个不存在的文件(如abc.pl),那么我们可以看到输出:

read file failed: No such file or directory at ./abc.pl line 3.

你可以试验一下,去掉or die…部分,再读取一个不存在的文件,看看结果。

第4~6行,是一个while循环结构。它与for类似,my $line声明了一个局部变量$line,仅在这个while循环结构中有效。while后面是循环的条件,每次循环时,<>操作符会从相关的文件句柄中读取一行,然后赋值给$line。直到文件的最后一行被读取,该条件都为真。在最后一行被读取之后,再次循环时,<>就读取不到任何内容了,即为空,那么在条件判断中表现为“假”,本次循环体不会被执行,循环结束。你可能会担心,my语句在循环的条件中,会不会每次循环时都声明一次局部变量。事实上Perl只会声明一次,但赋值是每次都会执行的,请放心。这里你可能注意到了,$line是包含换行符的。所以在输出时,不必额外指定"\n"。

第7行,close是关闭文件句柄的命令。它一般与open成对出现,且出现在open之后。在此句close之后文件句柄$fh_input不再有效。这里也同样使用了or die "…"的用法。