3

这段代码是一个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语句。

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

4

3 回答 3

5

由于您试图根据$end条件分配两个值之一,为什么不编写这样的条件表达式:

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

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

Perl 可以用来编写高深莫测的代码;但是,让所有代码都难以理解并不是一个好主意。将作业和打印堆叠在一行上往往难以理解。

于 2012-05-31T05:36:23.380 回答
4

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

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

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

于 2012-05-31T05:41:10.767 回答
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]);
于 2012-05-31T01:28:59.487 回答