1

我想从目录加载所有图片并将它们保存到数组中。

@files = `ls $ARGV[0] | grep -i -E jpe?g|gif|png$`;

这一行给了我一个错误:Final $ should be \$ or $name

@files = `ls $ARGV[0] | grep -i -E \'jpe?g|gif|png$\'`;

这条线有效,但它也加载图片“img.jpg.bmp”,而这不是我想要的,甚至加载目录,这是次要的,但也很糟糕。我究竟做错了什么?

4

2 回答 2

2

您还可以使用glob函数获取文件列表并使用grep过滤它们。例如:

my(@files) = grep { /\.(?:jpe?g|gif|png)\z/ } glob '"*"';

或者简单地说:

my(@files) =  glob '"*.jpeg" "*.jpg" "*.gif" "*.png"';
于 2013-05-01T11:56:55.337 回答
0

使用 shell 读取目录或 togrep有点难过

use autodie;
opendir my $dir, $ARGV[0];
my @files = grep !/\A\.\.?\z/ && /\.(?:jpe?g|gif|png)\z/, readdir $dir;
closedir $dir;

(我们必须手动过滤掉当前目录.和父目录..。有点像\A^但总是在字符串结尾匹配)\z$

你的问题`command`是它具有双引号字符串的插值语义。$ 总是表示下一个单词或字符是变量名(正则表达式除外)。这$`将是赛前变量,但 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

用单引号括起来仅对 shell 级别有用,而在错误消息起源的 Perl 级别上没有帮助。

在正则表达式中,行尾断言$只是一个普通的原子,如por [abc]。它不是运算符,不像()or |or []。因此,您必须强制使用括号的正确优先级。请参阅上面我提出的 Perl 解决方案中的正则表达式是如何完成的。

于 2013-05-01T11:33:42.147 回答