习题中碰到的perl的输出句柄的一个问题
Submitted by pzy on Sun, 08/24/2008 - 22:25.
in
我做第九章的第五道习题的时候用的下面这种写法,总是不能成功,
题目要求在以前写的每个perl程序的第一行调用程序的申明的下一行添加上版权声明,如果已经有版权声明的文件就跳过不写。以下是我写的代码:
------------------------------
#! /usr/bin/perl -w
foreach $in (@ARGV) { #逐个文件处理,我希望这个程序能处理多文件
open IN, "< $in" ;
open OUT, "> $in" ; #指定指出
@a_ = <IN> ;
$_ = join "-\n", @a_ ; #m//和s///似乎不能处理列表@,所以转化为变量来做
if (/## Copyright/) {
print "$in contains the copyright\n" ; }
else {
print "the file: $in not contains any copyright!\n" ;
s/(#!.{1,}?\n)/$1## Copyright (c) 2008 by PZY-bob\n/ ;
s/-\n//g ; #去除前面加进去的"-\n"字符
print OUT $_ ; #这里写成print $_还能正常输出到屏幕上,但用句柄就会把原文件清空
}
}
------------------------------
另外,这里为什么默认是居中对齐,而且没有修改的地方?
- pzy's blog
- Login or register to post comments


注意文件句柄打开的次序。
open IN,"<$IN";;
@a=
open OUT,">$in";
=============================
以你的程序open OUT,">$in"时,自动关闭了IN的句柄,
所以@a中读不到数据,是空的。
-----------------------------
要习惯使用 perl -d abc.pl 既perl的调试器来
调试程序。
OK,
OK, thanks!
但是同一章的习题3,写成如下的代码是成功的,也是先打开一个IN句柄然后马上又打开OUT句柄。
这是不是说明一个文件不能同时各有一个读取和写入的句柄?而对不同的文件就可以同时打开多个句柄来分别读写呢?
------------------------------
#! /usr/bin/perl -w
$in=$ARGV[0];
$out=$in;
$out=~s/(\.\w+)?$/\.out/;
open IN, "< $in";
open OUT, "> $out" ;
while (<IN>) {
chomp ;
s/larry/\n/gi ;
s/fred/Larry/gi ;
s/\n/Fred/gi;
print OUT $_,"\n" ;
}
-----------------------
“>$out"会创建新文件
open OUT,">$out" 会创建一个新文件。
如果已经有相同文件名的文件,那么原文件将被覆盖。
open OUT,">>$out" 是判断是否已有相同文件名的文件,如果有,则将内容添加,
如果没有则创建新文件。
在习题3种IN和OUT是两个不同的文件,不存在覆盖的问题。
同一文件只能有一个句柄。
你的原代码改成
open IN,"<$in";
open OUT,">>$in";
@a=<IN>;
就可以了。
但open OUT,">>$in"时 IN句柄已经关闭了,只是OUT这次是添加句柄,不会将原文件覆盖。
明白了,谢谢!
嗯,现在我看明白了,谢谢!
不过功能上我写的还是有点小问题,目前答案的方法好像还是最好的。