• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

perl对字段替换的小问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

今天做一份东西需要对一些文件特定的字段进行修改,其实这改一下很方便,甚至不需要去写一个脚本,但是为了方便使用,同时也是巩固一下perl的知识,便写了这个小脚本。

但在写的过程中还是碰到了几个小问题,首先是perl目录切换的问题,我在当前目录readdir、opendir一个目录,并获得文件名以后,需要将这些文件打开处理,但是打开这些文件必然需要一个绝对路径或者是相对路径,所以导致直接打开这些文件会提示文件不存在的错误,当然打开文件的时候使用了open .... or warn "can not open file : $!";这样的处理。所以这个时候我采用了拼接一个目录的方法。

 1 foreach my $myFile (readdir SCNDIR) {
 2   my $localFile;
 3   if ($scnDir =~ /\/$/) {
 4     $localFile = $scnDir . $myFile;
 5   } else {
 6     $localFile = $scnDir . '/' . $myFile;
 7   }
 8   if (-f $localFile) {
 9     editFileWord ($localFile);
10   }
11 }

其中$scnDir = $ARGV[0] 接收的,这里对$scnDir 做了一个判断,判断末尾是否加入了“/"符号。

这样就能解决文件路径的问题。

然后在匹配的时候发现自己犯了一个很大的错误。

就是通常使用open直接打开文件,然后就用while (<FILE>)的方式接收文件的每一句了,其中FILE是文件句柄。

然后对就收的到每一句进行匹配

$lines =~ s/$editWord/$editedWord/g

s表示搜索,g表示匹配所有,整句就标题把所有的$editWord替换成$editedWord

写完以后运行,查看文件,发现文件没有发生任何更改,想了一会发现自己真是蠢到家了。

$lines接收到了文件中读取的句子,但是我替换完以后并未将重新写回到文件中,开始想用seek的方法去写,发现如果替换的长短不一样,可能会造成一点问题。

也想过直接写入到一个新的文件,然后进行覆盖,不过终究感觉有点麻烦,然后搜了一个cpan,找到一个好模块

Tie::File

Tie::File - Access the lines of a disk file via a Perl array

用这个可以非常便捷地修改文件,方法如下:

sub editFileWord {
  my $file = shift;
  my $existWord = 0;
  tie my @arrayLines, 'Tie::File', $file or die "can not open file : $!";
  for (@arrayLines) {
    if (s/$editWord/$editedWord/g) {
      $existWord = 1;
    }
  }
  if ($existWord) {
    print $file . "\n";
  }
}

这样就完成了字段的替换,很简单的一个小程序,但是却存在着不少的小问题。

Tie对文件的处理还是有神奇的作用的,有心的朋友可以去关注一下。

对perl还在摸索中,愿各位大神能留下宝贵的意见。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
perl基本语法发布时间:2022-07-22
下一篇:
Perl使用Net::FTP从FTP上下载文件发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap