开发者

Perl File Name Change

I am studying and extending a Perl script written by others. It has a line:

@pub=`ls $sourceDir | grep '\.htm' | grep -v Default |  head  -550`;
foreach (@pub) {

   my $docName = $_;
   chomp($docName);
   $docName =~ s/\.htm$//g;
    ............}

I know that it uses a UNIX command firstly to take out all the htm files, then get rid of file extension.

Now I need to do one thing, which is also very important. That is, I need to change the file name of the actual files stored, by replacing the white space with underscore. I am stuck here because I am not sure whet开发者_StackOverflow中文版her I should follow his code style, achieving this by using UNIX, or I should do this in Perl? The point is that I need to modify the real file on the disk, not the string which used to hold the file name.

Thanks.


Something like this should help (not tested)

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?
}


It will be faster to use File::Copy to move the file to its new name rather than using this method which forks off a new process, spawns a new shell, etc. it takes more memory and is slower than doing it within perl itself.

edit.. you can get rid of all that backtick b.s., too, like this

my @files = grep {!/Default/} glob "$sourcedir/*.html";
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜