Perl if 这两种写法有什么区别,为什么结果不一样?

c11*_*1cc 1 perl if-statement

我已经写了这两个,但他们得到了不同的结果。我不确定哪里错了。

对于第一种样式,我将操作放在“ if ”条件之前:

$da{$array[0]}++ and $str="\n$array[0]\t$array[1]\t$array[-2]\n" if(exists $da{$array[0]} and $str!~/$array[0]\t$array[1]\t$array[-2]/);
Run Code Online (Sandbox Code Playgroud)

结果是:
R8112033 3
R8112038 1
R8112056 1
R8112057 1

而对于第二种常见样式:

if(exists $da{$array[0]} and $str!~/$array[0]\t$array[1]\t$array[-2]/)
  {
    $da{$array[0]}++;
    $str="\n$array[0]\t$array[1]\t$array[-2]\n";
  }
Run Code Online (Sandbox Code Playgroud)

结果是:
R8112033 2
R8112038 1
R8112056 1
R8112057 1

第二个结果是我想要的,但我不知道为什么它在第一个样式中不起作用。

下面是数据文件:
R8112033 EGFR T790M missense_mutation没有
R8112033 EGFR L858R missense_mutation没有
R8112033 TP53 - missense_mutation没有
R8112038 KRAS G12D missense_mutation没有
R8112056 - L858R missense_mutation是
R8112057 KRAS G12C missense_mutation无

这是完整的代码:

use strict;
use warnings;

my $infile=shift;
my %da;
my $str=0;
open IN, "$infile" or die $!;
while(<IN>)
{
        s/\r|\n//g;
        my @array = split /\t/,$_;
        $da{$array[0]}=0 if($array[-3]=~/\w/);
}
close IN;

open IN, "$infile" or die $!;
while(<IN>)
{
        s/\r|\n//g;
        my @array = split /\t/,$_;
        $da{$array[0]}++ and $str="\n$array[0]\t$array[1]\t$array[-2]\n" if(exists $da{$array[0]} and $str!~/$array[0]\t$array[1]\t$array[-2]/);
        #if(exists $da{$array[0]} and $str!~/$array[0]\t$array[1]\t$array[-2]/)
        #{
        #        $da{$array[0]}++;
        #        $str="\n$array[0]\t$array[1]\t$array[-2]\n";
        #}
}
close IN;

for my $key (sort keys %da)
{
        print "$key\t$da{$key}\n";
}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

ike*_*ami 6

你得到不同的结果,因为

$da{$array[0]}++ and $str = "..."
Run Code Online (Sandbox Code Playgroud)

$da{$array[0]}++;  $str = "..."
Run Code Online (Sandbox Code Playgroud)

不等价。第二个计算两个表达式,而第一个可能不执行赋值。

  • +1。具体来说,如果 `$da{$array[0]}` 在增量之前为零或未定义,第一个不会执行赋值。 (5认同)