海派开源潮流社区

一起参与开源.共同打造海派开源潮流社区(Kernel/Fedora/CentOS/Perl/Drupal)

习题中碰到的perl的输出句柄的一个问题
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 $_还能正常输出到屏幕上,但用句柄就会把原文件清空
    }
}
------------------------------

另外,这里为什么默认是居中对齐,而且没有修改的地方?

 

注意文件句柄打开的次序。

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这次是添加句柄,不会将原文件覆盖。

明白了,谢谢!

嗯,现在我看明白了,谢谢!

不过功能上我写的还是有点小问题,目前答案的方法好像还是最好的。

Reserved by www.17LAMP.net