2013-01-24 39 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

尚未登錄一段時間,我會快速瀏覽並回復您。 –