我是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" ;
}
}
答案 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;
}
}