我正在研究和扩展其他人编写的Perl脚本。它有一条线:
@pub=`ls $sourceDir | grep '\.htm' | grep -v Default | head -550`;
foreach (@pub) {
my $docName = $_;
chomp($docName);
$docName =~ s/\.htm$//g;
............}
我知道它首先使用UNIX命令取出所有htm文件,然后摆脱文件扩展名。
现在我需要做一件事,这也很重要。也就是说,我需要通过用下划线替换空格来更改存储的实际文件的文件名。我被困在这里因为我不确定我是否应该遵循他的代码风格,通过使用UNIX实现这一点,或者我应该在Perl中执行此操作?关键是我需要修改磁盘上的真实文件,而不是用来保存文件名的字符串。
感谢。
答案 0 :(得分:3)
这样的事情应该有帮助(未经测试)
use File::Basename;
use File::Spec;
use File::Copy;
use strict;
my @files = grep { ! /Default/ } glob("$sourceDir/*.htm");
# I didn't implement the "head -550" part as I don't understand the point.
# But you can easily do it using `splice()` function.
foreach my $file (@files) {
next unless (-f $file); # Don't rename directories!
my $dirname = dirname($file); # file's directory, so we rename only the file itself.
my $file_name = basename($file); # File name fore renaming.
my $new_file_name = $file_name;
$new_file_name =~ s/ /_/g; # replace all spaces with underscores
rename($file, File::Spec->catfile($dirname, $new_file_name))
or die $!; # Error handling - what if we couldn't rename?
}
答案 1 :(得分:2)
使用File::Copy将文件移动到新名称会更快,而不是使用这种方法来分解新进程,生成新的shell等等。它需要更多内存并且比执行速度慢它在perl内部。
编辑..你可以摆脱所有的反击b.s.,就像这样
my @files = grep {!/Default/} glob "$sourcedir/*.html";