2012-10-24 15 views
0

這是在windows上 - 我如何在perl中glob文件不以「.zip」結尾?Perl Glob所有不以zip結尾的文件

這是當前的代碼,對於這個問題的目的是不可改變的 - 所有可以改變的都是$ pattern變量的值。

my @arr = map { glob($_) } $pattern; 

作爲一個問題,這個代碼中map函數的目的是什麼?它有效,但我不明白。

+0

「it works」是什麼意思? – choroba

+1

'map {glob($ _)} $ pattern'相當於'glob $ pattern'。 – choroba

+0

choroba - 「works」 - 該語句根據預期返回一個給定數組的文件列表。那麼地圖有沒有任何意義?我會寫成「@arr = glob $ pattern;」 – user210757

回答

3

根據glob,它更像是通配符匹配,而不是真正的正則表達式匹配。我從來不喜歡glob(結果在同一個腳本中不可重複,就像glob在循環中一樣)。

我知道你說你不能改變水珠線(所以這可能是不可能的),但是這個代碼你想要做什麼,使用不同的代碼,但:

opendir(DIR, ".") or die $!; 
my @nonZipFiles = grep(!/^\.+|\.zip$/, readdir(DIR)); 
closedir(DIR); 

print "$_\n" for @nonZipFiles; 
+3

你確定'/ [^ \。zip] $ /'是你正在尋找的正則表達式嗎?畢竟,'[]'表示一個*字符類*!另外,在一個字符類中,'.'不是特殊的,不需要轉義。 ('(?!\。zip)$'可能會更好......或者'grep {not $ _ =〜/ \。zip $ /} ...') – amon

+1

我想你的意思是'grep! /\.zip$/,readdir(DIR)'。 *請*不要使用'map'這樣的操作符 - 它是一個操作符而不是'for'循環。 'print'$ _ \ n「for @ nonZipFiles'很好。 – Borodin

+0

對於'readdir'爲+1,對於錯誤的正則表達式爲-1。我發佈了一些替代過濾器,但沒有包含正則表達式,希望你能修復你的問題 –

5

的這裏使用map表示可能有多個模式爲glob。例如,

my @arr = map { glob($_) } ($pattern1, $pattern2); 

這將列出所有與任一模式匹配的文件(可能重複)。請注意,您也可以使用內建的readdir填充數組@arr

如果你被卡住行提到的,或者如果你使用readdir,你便可以過濾出結果,

use File::Basename; 
@arr = grep { ! (fileparse $_, '.zip')[2] } @arr; 

會更加嚴格,你可能要過濾掉這實際上是ZIP文件文件,而不只是名稱以.zip結尾的文件:

use File::MimeInfo::Magic; 
@arr = grep { mimetype($_) ne 'application/zip' } @arr; 
相關問題