为什么Perl有'elsif'而不是'elseif'?
我正在做这样的事情:
$somevariable = 0;
if ($idcount==5)
{
# Do something
if (somestatement is true) # 1
{
$somevariable = 1;
}
}
elsif ($idcount > 1 && somevariable = 0)
{
# Do something else here
}
代码永远不会出现在elsif声明中。在这种情况下,idcount
实际上是5,所以它是第一个if语句。但内部if
声明(1)不是真的,所以$somevariable
仍然是0.由于idcount
是5,它应该来到elsif
,因为$idcount
大于1而$somevariable
仍然是0。
也许我只是累了,没有看到明显的东西。
不,如果以前的if / elsif条件都没有,那么elsif
中的任何东西都只有机会被执行,那就是它的“其他”部分。
如果你想要两者都进行评估,只需将它设为if
而不是elsif
。
以下是the Llama book如何回答elsif vs elseif问题:
“因为拉里这么说。”
elsif ($idcount > 1 && somevariable = 0)
应该:
elsif ($idcount > 1 && $somevariable == 0)
赋值运算符返回赋值0,等于false,因此逻辑和'&&'总是失败。
在任何if-elsif-else构造中,您只执行条件为true的第一个分支。一旦该分支执行,程序将在整个if-elsif-else之后启动。
如果你想对可能的多个分支做一些事情,你可以使用多个if
块构建自己的类似于case的语法。有一个来自Perl 5.10的given-when
构造,但它已经退回到实验状态,可以从语言中删除。
至于elsif
的拼写,涉及到几个因素。
在C中,你写
if( ... ) {
... }
else if ( ... ) {
这有时会导致“悬空”的问题。如果你已经开始,但没有完成插入if-else if
正好在另一个之前,但不同,if
,你通过悬挂的其他组合两者。 Larry Wall并不喜欢这样,所以他将'else if'合并成一个单词,“elseif”。然而,这对拉里看起来很奇怪,因为规则是“我在e之前除了c之后......”,所以他通过取出“e”来确定它只是“elsif”。
我不知道你的混淆与perl使用“elsif”而不是“else if”或“elseif”的事实有什么关系。在我曾经使用过的每种语言中,从20世纪70年代以前的FORTRAN到Java,以及像Easytreive这样的“亮点”,如果你做“如果cond ...... else ......”那么其他语言之后的东西不会如果原始“cond”为真,则执行。这就是“其他”的含义。
在你的情况下,“cond”是“($ idcount == 5)”,你已经声明是真的,而else部分没有被执行,因为它是真的是“if($ idcount> 1 && $ somevariable == 0)......“。
Perl有elsif,因为perl不允许C风格“否则如果”没有括号。相反,你需要有类似的东西:
if (x) {
}
else {
if(y) {
}
}
Perl中的“elsif”与“elseif”,“else if”和“elif”在其他语言中的工作方式完全相同。这只是一个拼写问题。
use strict;
use warnings;
$somevariable = 0;
if ($idcount==5)
{
# do something
if ( 1 )
{
$somevariable = 1;
}
}
else
{
if ($idcount > 1 && somevariable == 0) # this line was wrong in the question
{
# do something else here
}
}
use Modern::Perl;
$somevariable = 0;
given($idcount){
when( 5 ){
# do something
if ( 1 ){
$somevariable = 1;
}
}
when( $_ > 1 && $somevariable == 0 ){
# do something else here
}
}
use Modern::Perl;
与use strict;
use warnings;
use 5.010;
相同
如果你打算用任何语言使用if...elsif
,你的条件应该互相排斥。您的示例中的两个条件可能同时为真,因此您应该将其分解为两个单独的if
语句。