设为首页 收藏本站
查看: 984|回复: 0

[经验分享] Perl文件处理示例——批量添加Copyright版权信息

[复制链接]

尚未签到

发表于 2015-12-27 11:34:24 | 显示全部楼层 |阅读模式
  对所有输入文件,如果没有版权信息则加上版权信息,否则什么都不做,并对原文件以.bak结尾备份。
  开始我使用如下程序(尝试前千万先备份输入的文件):



#!usr/bin/perl -w
$^I = ".bak";
my %do_these;
foreach (@ARGV){
    print $_;
  $do_these{$_} = 1;
}
while(<>){
  if(/^## Copyright/){
    delete $do_these{$ARGV};
  }
}
@ARGV = sort keys %do_these;
while(<>){
  if(/^#!/){
    $_ .= "## Copyright (C) 2011 by yujianjun";
  }
  print;
}
  结果:原文件和备份文件全部空白,真是糟糕。(切记以后测试程序时,要做好备份)。
分析原因:
  主要是由于$^I使用错误。先来看看关于$^I的运作原理:
  $^I 默认值undef,这不会影响程序。如果将其赋值为某个字符串(如程序中的".bak"),程序将执行备份操作,并将该字符串添加到原文件名后面,成为备份文件名的拓展名。使用钻石操作符打开文件时,perl的操作是,先将打开的文件名改成加了拓展名的文件名,然后再新建一个原来的文件名的文件,然后在程序一行行读入文件内容并做一些改动后,会保存到新文件中去。这样就相当于修改了文件内容,并将老文件进行了备份。当然,如果值是undef,则不会备份旧文件。
  由于上面程序中将$^I = ".bak";放在最前面,但后面有两次读取文件操作。假设读入文件为file.pl,第一次while(<>)将原文件变成了file.pl.bak。然后新建一个空文件命名为file.pl;但新文件只有程序结束的时候才会写入磁盘中,所以接下来第二次读取文件操作while(<>)时,将会把空白的file.pl变成file.pl.bak,这样就覆盖了第一次的备份文件,然后再新建一个新的空白文件file.pl,此时,包括原文件和备份文件内容都是空白。
  理解了$^I的工作原理,程序就很容易修改了:
  只需将$^I = ".bak";放到最后一个文件读取操作while(<>)之前就好了,如下:



1 #!usr/bin/perl -w
2
3 my %do_these;
4 @ARGV = ("sinx.pl","nvidia.pl","changeName.pl");
5
6 foreach (@ARGV){
7     print $_;
8   $do_these{$_} = 1;
9 }
10
11 while(<>){
12   if(/^## Copyright/){
13     delete $do_these{$ARGV};
14   }
15 }
16
17 @ARGV = sort keys %do_these;
18 $^I = ".bak";
19 while(<>){
20   if(/^#!/){
21     $_ .= "## Copyright (C) 2011 by yujianjun";
22   }
23   print;
24 }
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156902-1-1.html 上篇帖子: 为ZendStudio配置Perl支持 下篇帖子: Perl 教学 面向对象编程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表