我想从目录加载所有图片并将它们保存到数组中。
@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”,而这不是我想要的,甚至加载目录,这是次要的,但也很糟糕。我究竟做错了什么?
使用 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 级别上没有帮助。
在正则表达式中,行尾断言$
只是一个普通的原子,如p
or [abc]
。它不是运算符,不像()
or |
or []
。因此,您必须强制使用括号的正确优先级。请参阅上面我提出的 Perl 解决方案中的正则表达式是如何完成的。