我有以下代码:
$path = "/srv/www/root/www/data/".$img1;
my $type = `file $path`;
unless ($type =~ /JPEG/i
|| $type =~ /PNG/i) {
print "The file is not a valid JPEG or PNG.";
}
我是perl的新手。我想将其更改为if(isimagefile) perform this set of code; else perform this set of code
我不明白的是这里的逻辑。我不知道=~
是什么,我不理解unless
逻辑
更新
这是我目前的逻辑:
$path = "/srv/www/root/www/data/".$img1;
my $type = `file $path`;
if($type =~ /JPEG/i || $type =~ /PNG/i || $type=~ /JPG/i){
}
它似乎没有起作用。
答案 0 :(得分:1)
=~
测试右侧与the regular expression左侧的左侧。
unless (condition)
相当于if (! (condition) )
答案 1 :(得分:0)
正如Quentin所说,=~
是一个正则表达式测试。在您的情况下,它会测试$type
是否包含短语JPEG
。斜杠/
是正则表达式语法的一部分。有关详细信息,请参阅Perl's tutorial。
此外,unless
恰好与if
相反。有些人在想表达if (not …)
时会使用它。我个人认为这种不好的做法是因为它降低了可读性,特别是当条件由多个部分组成并且其中包含!
时,例如unless($a>5 || ($a!=7 && (!$b)))
。想知道条件何时匹配真是太恐怖了。
所以代码
unless ($type =~ /JPEG/i || $type =~ /PNG/i) {
print "The file is not a valid JPEG or PNG.";
}
可以改写为
if ( ! ($type =~ /JPEG/i || $type =~ /PNG/i) ) {
print "The file is not a valid JPEG or PNG.";
} else {
print "The file IS a valid JPEG or PNG.";
}
或者反过来(代码块和条件交换):
if ( $type =~ /JPEG/i || $type =~ /PNG/i ) {
print "The file IS a valid JPEG or PNG.";
} else {
print "The file is not a valid JPEG or PNG.";
}
这可以通过加入两个条件,将它们移动到正则表达式并在那里对它们进行OR运算来进一步简化:
if ( $type =~ /(JPEG|PNG)/i ) {
print "The file IS a valid JPEG or PNG.";
} else {
print "The file is not a valid JPEG or PNG.";
}
最后一个片段转换为" if($ type contains JPEG)或($ type contains PNG)" ,而最后一个片段转换为 "如果$ type包含(JPEG或PNG)" 。结果是相同的,但$type
和正则表达式只被考虑一次,这(理论上)使它更快。
在您的尝试中,您还会引用JPG
(没有E
)。这也可以用正则表达式表示,因为JPG
就像JPEG
但没有E
,所以E
是可选的。因此:
if ( $type =~ /(JPE?G|PNG)/i ) {
print "The file IS a valid JPEG, JPG, or PNG.";
} else {
print "The file is not a valid JPEG or PNG.";
}
?
表示E
的可选性。再次,请参阅教程。
我只是想回答你的问题。但是对于未来请记住,SO不是教程服务,请参考https://stackoverflow.com/questions/how-to-ask和https://stackoverflow.com/help/mcve,并使用您首选的搜索引擎来找出基本的Perl语法。