删除perl中的通配符

时间:2013-01-24 23:16:03

标签: perl wildcard

我是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))

原因可能是什么?

2 个答案:

答案 0 :(得分:3)

-e $list检查文件是否存在,因此对AA_???_???.DATAA???.DAT都返回false(除非你确实有文件命名)。一个人工作而另一个人不工作是不正确的。

unlink(glob(${my_dir}AA_???_???.DAT"))挂起也是不正确的。首先,它甚至都没有编译。

答案 1 :(得分: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/");
}