Perl if语句混乱

时间:2012-05-31 01:21:19

标签: regex perl if-statement

此代码是if语句;我想测试$rtgene是否包含trn。 我用$rtgene= nad3测试了代码:

if ($rtgene!~/trn/){
$end=$data[$i][0]+100;
}
else{
$end =$data[$i][1];
}
print $end;

这是一个不起作用的替代表达式:

($rtgene!~/trn/)? $end=$data[$i][0]+100 : $end=$data[$i][1]; print $end;

问题出现在第一个代码(正常的if else语句)中它起作用并给我预期的结果,但另一个(最后一行)它不起作用;它总是执行else语句。

问题:这个问题的原因是什么?怎么解决?

3 个答案:

答案 0 :(得分:5)

由于您尝试根据条件将两个值中的一个赋值给$end,为什么不编写这样的条件表达式:

$end = ($rtgene !~ /trn/) ? $data[$i][0]+100 : $data[$i][1];
print $end;

这可以避免ysth准确诊断的优先级问题,并且更容易理解。

Perl可用于编写不可思议的代码;但是,让所有代码都难以理解并不是一个好主意。将作业堆叠起来并打印在一行上就会趋于难以理解。

答案 1 :(得分:4)

以下是使用三元条件运算符的方法:

$end = $rtgene !~ /trn/ ? $data[$i][0]+100 : $data[$i][1];

它评估?之前的部分,如果为真,则返回第一个选项,否则返回第二个选项。

答案 2 :(得分:3)

对我来说看起来像是一个优先级错误。 =的优先级低于?:,所以它就像:

( ($rtgene!~/trn/) ? $end=$data[$i][0]+100 : $end ) = $data[$i][1];

也就是说,三元组的任何一个分支都将$data[$i][1]分配给$end(尽管真正的分支首先分配另一个最终被覆盖的值)。

请改为尝试:

($rtgene!~/trn/) ? ($end = $data[$i][0]+100) : ($end = $data[$i][1]);