使用shell讀取目錄或grep
是種悲哀
use autodie;
opendir my $dir, $ARGV[0];
my @files = grep !/\A\.\.?\z/ && /\.(?:jpe?g|gif|png)\z/, readdir $dir;
closedir $dir;
(我們必須manualy過濾掉..
。當前目錄.
和父目錄\A
就像^
和\z
有點像$
,但始終匹配在字符串末尾)
的問題在於它具有雙引號字符串的插值語義。 $
總是表示下一個單詞或字符是變量名稱(正則表達式除外)。 $`
將是prematch變量,但Perl很聰明,看到你不想要。您的錯誤信息提出的解決方案是逃避$
:
`grep -i -E jpe?g|gif|png\$` # … and it meant this.
# It still thinks gif and png are commands
`grep -i -E '(jpe?g|gif|png)\$'` # regex correctly quoted on shell level
用單引號周圍僅是外殼上的水平有幫助的,而不是在Perl的水平,其中錯誤消息的發源地。
在正則表達式中,行結束聲明$
只是一個普通原子,如p
或[abc]
。它不是運營商,不像()
或|
或[]
。因此你必須強制正確的優先與parens。看看我提出的Perl解決方案中的正則表達式在上面是如何完成的。
+1 [您的評論](http://stackoverflow.com/questions/16317221/load-pictures-from-directory-into-array#評論233365344_16317351)*「爲什麼使用外殼如此傷心?」* – fedorqui 2013-05-01 12:32:00