Chinaunix

标题: 谁能介绍一下truncate在修改文件方面的具体用法? [打印本页]

作者: qiyanse    时间: 2009-12-08 09:45
标题: 谁能介绍一下truncate在修改文件方面的具体用法?
  1. chomp($BuildNum=<STDIN>);
  2. open FR,"<test.xml" or "Cannot open test.xml:($!)\n";
  3. open FW,"+<test.xml" or "Cannot open test.xml:($!)\n";
  4.         
  5.         while(<FR>)
  6.         {         
  7.           if(/\bBUILD\b\=/i){
  8.          
  9.                 s/(\bBUILD\b\=\")(?:.*)(\")/$1$BuildNum$2/i;
  10.                 print FW $_;
  11.           }else{print FW $_;}
  12.         }
  13.         truncate(FW,tell(FW));
  14.         close FR;
  15.         close FW;
复制代码


以上代码保存后可以执行,但是我不懂得  truncate(FW,tell(FW)); 在这里有什么特别的用处*?(另外,用truncate的时,有的时候在某行或某几行会多处几个字母,很奇怪)
如果没有  truncate(FW,tell(FW)); 程序也可以执行。
作者: ly5066113    时间: 2009-12-08 09:54
标题: 回复 #1 qiyanse 的帖子
truncate
这个函数截断在 FILEHANDLE 上打开的或者 EXPR 命名的文件到指定的长度。

通俗点将,就是为了在不用临时文件的情况下,直接修改原文件。
你可以看到,上面的代码读、写都是对同一个文件。
作者: qiyanse    时间: 2009-12-08 10:07
标题: 回复 #2 ly5066113 的帖子
谢谢你,但是我还是不懂,用truncate和不用trucate有什么不同?看起来结果都一样的啊。因为我的文件是xml格式的,而且我用了truncate之后会多加字母,这个我也不懂,是为什么?
作者: ly5066113    时间: 2009-12-08 10:33
标题: 回复 #3 qiyanse 的帖子
可能我说的不准确,以代码为例吧:

  1. $ seq 10 > test.xml
  2. $ cat test.xml
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 10
  13. $ cat test.pl
  14. #! /usr/bin/perl

  15. use strict;
  16. use warnings;

  17. open FR,"<test.xml" or die "Cannot open test.xml:($!)\n";
  18. open FW,"+<test.xml" or die "Cannot open test.xml:($!)\n";

  19. while(<FR>)
  20. {
  21.         print FW $_ if $. == 1;
  22. }

  23. truncate(FW,tell(FW));
  24. close FR;
  25. close FW;
  26. $ test.pl
  27. $ cat test.xml
  28. 1
复制代码

  1. $ seq 10 > test.xml
  2. $ cat test.xml
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 10
  13. $ cat test.pl
  14. #! /usr/bin/perl

  15. use strict;
  16. use warnings;

  17. open FR,"<test.xml" or die "Cannot open test.xml:($!)\n";
  18. open FW,"+<test.xml" or die "Cannot open test.xml:($!)\n";

  19. while(<FR>)
  20. {
  21.         print FW $_ if $. == 1;
  22. }

  23. #truncate(FW,tell(FW));
  24. close FR;
  25. close FW;
  26. $ test.pl
  27. $ cat test.xml
  28. 1
  29. 2
  30. 3
  31. 4
  32. 5
  33. 6
  34. 7
  35. 8
  36. 9
  37. 10
复制代码

作者: qiyanse    时间: 2009-12-08 10:49
标题: 回复 #4 ly5066113 的帖子
太感谢了,:wink:  。现在懂了。谢谢你~~~
作者: flw    时间: 2009-12-08 11:26
tell 和 print 一起用会有 BUG 的吧。
不是同一个层面的东西。
作者: hotsnow    时间: 2009-12-09 09:25
原帖由 flw 于 2009-12-8 11:26 发表
tell 和 print 一起用会有 BUG 的吧。
不是同一个层面的东西。


我记得你以前写过的代码就是这样用的哦.没记错的话上面的代码应该是学你的,呵呵
作者: flw    时间: 2009-12-09 10:14
原帖由 hotsnow 于 2009-12-9 09:25 发表


我记得你以前写过的代码就是这样用的哦.没记错的话上面的代码应该是学你的,呵呵

你又是谁?

作者: hotsnow    时间: 2009-12-09 20:53
标题: 回复 #8 flw 的帖子
我是谁不重要嘛,关键是有bug要解决嘛.
flw 这么经典的代码,一定要记住了.呵呵




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2