免费注册 查看新帖 |

Chinaunix

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

谁能介绍一下truncate在修改文件方面的具体用法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-08 09:45 |只看该作者 |倒序浏览
  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)); 程序也可以执行。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2009-12-08 09:54 |只看该作者

回复 #1 qiyanse 的帖子

truncate
这个函数截断在 FILEHANDLE 上打开的或者 EXPR 命名的文件到指定的长度。

通俗点将,就是为了在不用临时文件的情况下,直接修改原文件。
你可以看到,上面的代码读、写都是对同一个文件。

论坛徽章:
0
3 [报告]
发表于 2009-12-08 10:07 |只看该作者

回复 #2 ly5066113 的帖子

谢谢你,但是我还是不懂,用truncate和不用trucate有什么不同?看起来结果都一样的啊。因为我的文件是xml格式的,而且我用了truncate之后会多加字母,这个我也不懂,是为什么?

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
4 [报告]
发表于 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
复制代码

论坛徽章:
0
5 [报告]
发表于 2009-12-08 10:49 |只看该作者

回复 #4 ly5066113 的帖子

太感谢了,:wink:  。现在懂了。谢谢你~~~

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2009-12-08 11:26 |只看该作者
tell 和 print 一起用会有 BUG 的吧。
不是同一个层面的东西。

论坛徽章:
0
7 [报告]
发表于 2009-12-09 09:25 |只看该作者
原帖由 flw 于 2009-12-8 11:26 发表
tell 和 print 一起用会有 BUG 的吧。
不是同一个层面的东西。


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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2009-12-09 10:14 |只看该作者
原帖由 hotsnow 于 2009-12-9 09:25 发表


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

你又是谁?

论坛徽章:
0
9 [报告]
发表于 2009-12-09 20:53 |只看该作者

回复 #8 flw 的帖子

我是谁不重要嘛,关键是有bug要解决嘛.
flw 这么经典的代码,一定要记住了.呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP