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;

問題は最初のコード(elseステートメントの場合は通常)にあり、期待どおりの結果が得られますが、別のコード(最後の行)は機能しません。常にelseステートメントを実行します。

質問:この問題の原因は何ですか?それを修正する方法は?

4

3 に答える 3

5

$end条件に基づいて2つの値のいずれかを割り当てようとしているので、次のような条件式を記述してみませんか。

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

これにより、 ysthによって正確に診断された優先順位の問題が回避され、非常に理解しやすくなります。

Perlは、不可解なコードを書くために使用できます。ただし、すべてのコードを不可解にすることはお勧めできません。課題を積み重ねて1行に印刷することは、不可解な傾向があります。

于 2012-05-31T05:36:23.380 に答える
4

三項条件演算子を使用する方法は次のとおりです。

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

前にパーツを評価し、?これがtrueの場合は最初のオプションを返し、それ以外の場合は2番目のオプションを返します。

于 2012-05-31T05:41:10.767 に答える
3

私には優先順位エラーのように見えます。=は?:よりも優先順位が低いため、次のようになります。

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

つまり、3値のいずれかのブランチがに割り当て$data[$i][1]られ$endます(ただし、実際のブランチは最初に別の値を割り当てて、最終的に上書きされます)。

代わりにこれを試してください:

($rtgene!~/trn/) ? ($end = $data[$i][0]+100) : ($end = $data[$i][1]);
于 2012-05-31T01:28:59.487 に答える