搜索和替换不保存到文件

时间:2017-12-01 17:16:18

标签: perl search replace

我是Perl的新手,已经和它一起工作了一天。我正在尝试编写一个脚本,该脚本将转到每个.cpp文件和.hpp文件,更改文件读写权限,同时还搜索字符串并替换它。这就是我到目前为止所拥有的。我能够更改每个文件读取和写入问题的权限,当我尝试替换字符串时。它正确打印出来但不会保存到文件中。欢迎任何建议。

#gets first first value of array being past as argument. 
my $path = shift;

#open directory
opendir(DIR, $path) or die "Unable to open $path: $!";
#read in the files
#ignores hidden files eg. .\..\
my @files = grep{!/^\.{1,2}$/} readdir(DIR);
#close directory
close(DIR);
#put full path of file
@files = map {$path . '\\' . $_ } @files;

for (@files){
    #if directory then use recusrion to open file 
    if(-d $_){
        change_permission($_);
    }elsif((-f $_) && (($_ =~m/\.cpp/) || ($_ =~m/\.hpp/) || ($_ =~m/\.txt/))){
        chmod 0666, $_ or die "Couldn't chmod";

        open(DATA, "+<", $_) or die "file could not open $! \n";
            while(<DATA>){
                s/best/worst/ig;
                print;
            }

        close(DATA) or die "Couldn't close file properly $! \n" ;


    }
}

2 个答案:

答案 0 :(得分:1)

我会用这样的东西

use strict;
use warnings;
use Path::Tiny;

my $p = shift // '.';
my $iter = path($p)->iterator({recurse => 1});
while( my $path = $iter->() ) {
        $path->chmod("ug+w");
        $path->edit( sub { s/best/worst/ } ) if( -f $path && $path =~ /\.([ch]pp|txt)$/i );
}

答案 1 :(得分:0)

使用print;时,您要打印到STDOUT,因为这是所选的文件句柄。然后,您的输出在屏幕上可见,但不会在文件中更改。你打开它进行阅读和写作的事实并不重要。

您可以使用print HANDLE ARGS表单打印到文件句柄。

print DATA $_;

(注意DATA对于你的句柄来说是一个非常糟糕的主意,因为这是Perl提供的读取脚本__DATA__部分的默认句柄。通常,你应该是使用词法文件句柄和三个参数open,因此它将成为open my $fh, '+<', $filename or die $!。)

但是,只需写入正确的句柄就不能实现读/写。这将搞乱Perl关于你目前在文件中的位置的想法。

使用the approach outlined in this answer更有意义,并利用Perl的内置就地编辑功能,如-i命令行开关。

  our @ARGV = ($file);

  while ( <ARGV> ) {
     tr/a-z/A-Z/;
     print;
  }

要将其应用于您的代码,您必须这样做。我故意没有修复代码的所有样式和安全问题。请参阅我对codereview的评论。

# elsif (...) {
    chmod 0666, $_ or die "Couldn't chmod";

    @ARGV = ($_);
    while(<DATA>){
        s/best/worst/ig;
        print;
    }
}