這是在windows上 - 我如何在perl中glob文件不以「.zip」結尾?Perl Glob所有不以zip結尾的文件
這是當前的代碼,對於這個問題的目的是不可改變的 - 所有可以改變的都是$ pattern變量的值。
my @arr = map { glob($_) } $pattern;
作爲一個問題,這個代碼中map函數的目的是什麼?它有效,但我不明白。
這是在windows上 - 我如何在perl中glob文件不以「.zip」結尾?Perl Glob所有不以zip結尾的文件
這是當前的代碼,對於這個問題的目的是不可改變的 - 所有可以改變的都是$ pattern變量的值。
my @arr = map { glob($_) } $pattern;
作爲一個問題,這個代碼中map函數的目的是什麼?它有效,但我不明白。
根據glob,它更像是通配符匹配,而不是真正的正則表達式匹配。我從來不喜歡glob(結果在同一個腳本中不可重複,就像glob在循環中一樣)。
我知道你說你不能改變水珠線(所以這可能是不可能的),但是這個代碼你想要做什麼,使用不同的代碼,但:
opendir(DIR, ".") or die $!;
my @nonZipFiles = grep(!/^\.+|\.zip$/, readdir(DIR));
closedir(DIR);
print "$_\n" for @nonZipFiles;
你確定'/ [^ \。zip] $ /'是你正在尋找的正則表達式嗎?畢竟,'[]'表示一個*字符類*!另外,在一個字符類中,'.'不是特殊的,不需要轉義。 ('(?!\。zip)$'可能會更好......或者'grep {not $ _ =〜/ \。zip $ /} ...') – amon
我想你的意思是'grep! /\.zip$/,readdir(DIR)'。 *請*不要使用'map'這樣的操作符 - 它是一個操作符而不是'for'循環。 'print'$ _ \ n「for @ nonZipFiles'很好。 – Borodin
對於'readdir'爲+1,對於錯誤的正則表達式爲-1。我發佈了一些替代過濾器,但沒有包含正則表達式,希望你能修復你的問題 –
的這裏使用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;
「it works」是什麼意思? – choroba
'map {glob($ _)} $ pattern'相當於'glob $ pattern'。 – choroba
choroba - 「works」 - 該語句根據預期返回一個給定數組的文件列表。那麼地圖有沒有任何意義?我會寫成「@arr = glob $ pattern;」 – user210757