使用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