免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2649 | 回复: 10
打印 上一主题 下一主题

我是新手,碰到一个比较弱的问题,求教! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-14 11:35 |只看该作者 |倒序浏览
我碰到一个问题,当我用追加>>方式打开文件,并匹配文件中以/^(\#!)/开头的内容时,就不能匹配,而如果我去掉>>,直接打开文件,就能匹配成功,请问我想将修改过的内容保存到文件,怎么办呢?
我的代码如下:

#!/usr/bin/perl

print "test start\n";

foreach $filename (@ARGV)
{
        print "$filename\n";
        open CUR_FILE, ">> $filename";   #如果这里将>>去掉,则在下面的if匹配中,可以匹配。否则不行。
                print "$_\n";

        while(<CUR_FILE>)
        {
                chomp;
                if(/^(\#!)/)
                {
                        $_ .= "## Copyright (C) 2010 by Yours Truly";
                }
                print "$_\n";
                print CUR_FILE "$_\n";
        }
}

论坛徽章:
0
2 [报告]
发表于 2010-05-14 12:21 |只看该作者
>> 会把文件指针定位到文件末尾。

论坛徽章:
0
3 [报告]
发表于 2010-05-14 12:42 |只看该作者
如果你要在文件末添加内容,可以这样写:

open CUR_FILE, "+< $filename";

但你显然不是要这样做,所以还是老老实实用两次OPEN吧
  1. #!/usr/bin/perl

  2. print "test start\n";
  3. @file = ("test.pl");
  4. foreach $filename (@file)
  5. {
  6.         print "$filename\n";
  7.         open CUR_FILE, "<$filename";
  8.         my @lines = <CUR_FILE>;
  9.         close CUR_FILE;
  10.         open CUR_FILE, ">$filename";
  11.         foreach (@lines)
  12.         {
  13.                 chomp;
  14.                 if(/^(\#!)/)
  15.                 {
  16.                         $_ .= "  ## Copyright (C) 2010 by Yours Truly";
  17.                 }
  18.                 print "$_\n";
  19.                 print CUR_FILE "$_\n";
  20.         }
  21.         close CUR_FILE;
  22. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-05-14 12:50 |只看该作者
我昨天也遇到同样的问题 正如 楼上所说老老实OPEN两次 吧!

论坛徽章:
0
5 [报告]
发表于 2010-05-14 12:51 |只看该作者
回复 2# toniz


    哈哈,非常感谢,真是一语惊醒梦中人啊。。。我太嫩了。。

论坛徽章:
0
6 [报告]
发表于 2010-05-14 12:52 |只看该作者
回复 3# iamlimeng


    非常感谢,呵呵。。。

论坛徽章:
0
7 [报告]
发表于 2010-05-14 14:09 |只看该作者
回复 3# iamlimeng


   你好,你的程序我看了一下,是把文件先读入列表,然后再逐行读取修改,再写回去。但是如果文件内容比较大的时候,这样是不是在效率上会很低呢?
能不能直接逐行读入文件内容,然后修改后直接保存呢?

论坛徽章:
0
8 [报告]
发表于 2010-05-14 14:16 |只看该作者
文件内容过大的时候,肯定会很耗系统资源,但这种情况并不多。

稳妥点的话,还是用while (<>)好,节省点内存。

各有优缺点,具体情况具体分析吧

论坛徽章:
0
9 [报告]
发表于 2010-05-14 14:47 |只看该作者
文件内容过大的时候,肯定会很耗系统资源,但这种情况并不多。

稳妥点的话,还是用while ()好,节省点内 ...
iamlimeng 发表于 2010-05-14 14:16



    比如有一个日志文件,有2G这么大,我需要修改其中的一个数据,然后保存,这个时候,如何用perl实现打开这个日志文件,然后修改,再保存,这个过程不涉及到打开其他的文件或创建新文件。我想了一下,如果直接读到一个列表确实不方便,用while<>的话,保存修改后的内容呢?赐教赐教。。谢谢哈。。

论坛徽章:
0
10 [报告]
发表于 2010-05-14 15:00 |只看该作者
open后,seek到修改位置,再更新数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP