我是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))
原因可能是什么?
答案 0 :(得分:3)
-e $list
检查文件是否存在,因此对AA_???_???.DAT
或AA???.DAT
都返回false(除非你确实有文件命名)。一个人工作而另一个人不工作是不正确的。
unlink(glob(${my_dir}AA_???_???.DAT"))
挂起也是不正确的。首先,它甚至都没有编译。
答案 1 :(得分:0)
我会使用opendir
和readdir
内置函数(从文档示例中修改):
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/");
}