2013-01-24 35 views
0

我是一位Perl新手,但我认为以下方面应该可行。我有一个更大的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

你应该在Perl脚本中总是有'use strict;'和'use warnings;',它们真的能帮你解决错误。 – Perleone

+0

谢谢。我已经注意到了。 – Yacob

+0

我的回答有没有使用Yacob? –

回答

3

-e $list检查是否存在文件,因此对于AA_???_???.DATAA???.DAT(除非实际上已命名文件完全相同)返回false。这是不正确的,一个人工作,而另一个人不工作。

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

+0

foreach my $ list(@mylist){ system(“cp $ {list} $ {my_other_dir}”); } 这只是挂断。任何意见请! – Yacob

+0

特别挂什么?你是如何确定这一点的? – ikegami

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/"); 
} 
+0

我会在你的['grep'](http://p3rl.org/grep)中将模式匹配写成'/ \ A AA(?:_..._)?... [。] DAT \ Z/x'。 –

+0

嗨Drav,当我厌倦使用File :: Find模块运行递归文件操作时,出现以下错误:使用模式匹配(m //)中的未初始化值$ file在wildcard.pl行55. 使用模式匹配中的未初始化值$ file(m //)在wildcard.pl第55行。 在/usr/share/perl/5.14/File/Find.pm第1064行给出的no&wanted子例程。第55行引用“return if .......“ – Yacob

+0

尚未登录一段时间,我会快速浏览并回复您。 –