0

我是 Perl 的新手,但我认为以下应该可行。我有一个更大的 perl 脚本的以下片段

@mylist = ("${my_dir}AA_???_???.DAT", "${my_dir}AA???.DAT");

foreach my $list (@mylist) {
    if (-e $list) {
        system ("cp ${list} ${my_other_dir}");
    }
}

上面的代码片段无法找到那些通配符,AA_???_???.DAT但它确实能够找到带有通配符的文件名AA???.DAT

我也尝试将文件删除AA??_???.DAT

unlink(glob(${my_dir}AA_???_???.DAT")) 

但脚本只是挂断了。但它可以使用以下方法删除匹配的文件AA???.DAT

unlink(glob("${my_dir}AA???.DAT))

可能是什么原因?

4

2 回答 2

3

-e $list检查文件是否存在,因此对两者都返回 falseAA_???_???.DATAA???.DAT(除非您实际上有确切命名的文件)。一个有效而另一个无效,这不是真的。

unlink(glob(${my_dir}AA_???_???.DAT"))挂起也不是真的。对于初学者,它甚至无法编译。

于 2013-01-24T23:25:51.270 回答
0

我会使用opendirreaddir内置函数(从文档示例修改):

opendir(my $dh, $some_dir) || die "can't opendir $some_dir: $!";
@mylist = grep { /^(.AA_..._...\.DAT|AA...\.DAT)$/ && -f "$some_dir/$_" } readdir($dh);
closedir $dh; 

然后你可以插入你的原始代码:

foreach my $list (@mylist) {
    if (-e $list) {
        system ("cp $some_dir/${list} ${my_other_dir}/");
    }
}

对于目录递归文件操作,我真的很喜欢使用 File::Find CPAN 模块。这将遍历子目录,将每个文件传递给指定的子例程以处理该文件。举个例子:

#! /usr/bin/perl

use strict;
use warnings;
use File::Find;

my @dirs='/path/to/dir';
my $my_other_dir='/path/to/otherdir';

find(&process_files, @dirs);

sub process_files {
    my($file) = $_;
    my($fullpath) = $File::Find::name;

    return if($file !~ /^AA_..._...\.DAT$/ and
        $file !~ /^AA...\.DAT$/);

    system ("cp $fullpath $my_other_dir/");
}
于 2013-01-25T01:15:59.943 回答