如果是perl中的子句

时间:2016-05-06 15:53:23

标签: perl

我有以下代码:

$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){

}

它似乎没有起作用。

2 个答案:

答案 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-askhttps://stackoverflow.com/help/mcve,并使用您首选的搜索引擎来找出基本的Perl语法。