散列的散列中的 Perl 计数器

标签 perl hash

我有一个如下所示的文件:

1   1  A12P P1234
1   0  A52Q P1234
1   1  M12P P8866
1   1  R50T P1222
1   1  A82L P8866
0   0  D83F P8866
....

在 Perl 循环中,我解析每一行并保存每个列值:

while (<FILE>){
     ...
     my $actual=$1; my $predicted=$2; $mutation=$3; $id=$4; 
        if ($actual==1) {
            if ($predicted==1)   { $hash{$id}{$truep}++; } 
            elsif ($predicted==0){ $hash{$id}{$falsen}++; } 
        } elsif ($actual==0) {
            if ($predicted==0)   { $hash{$id}{$truen}++; } 
            elsif ($predicted==1){ $hash{$id}{$falsep}++; } 
        }
}

for $id (keys %hash) {
        $tp = $hash{$id}{$truep};
        $tn = $hash{$id}{$truen};
        $fp = $hash{$id}{$falsep};
        $fn = $hash{$id}{$falsen};
        ...
    }

我希望对于 P8866:

$hash{$id}{$fp} --> FP = 0
$hash{$id}{$tp} --> TP = 2
$hash{$id}{$fn} --> FN = 0
$hash{$id}{$tn} --> TN = 1

我希望对于 P1234:

$hash{$id}{$fp} --> FP = 0
$hash{$id}{$tp} --> TP = 1
$hash{$id}{$fn} --> FN = 1
$hash{$id}{$tn} --> TN = 0

但它没有给我预期的值。我是否错误地定义了哈希值?有更好的方法来解析文件吗?

最佳答案

假设您确实希望 tn 等成为常量而不是变量,则需要为每个 id 初始化所有 4 个值,以便在 hash-of-hashes 中获得 0。

use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys=1;

my %hash;
while (<DATA>){
    chomp;
    my ($actual, $predicted, $mutation, $id) = split;
    for my $type (qw(tn tp fn fp)) {
        $hash{$id}{$type} = 0 unless exists $hash{$id}{$type}; 
    }
    if (($actual == 1) and ($predicted == 1)) {
        $hash{$id}{tp}++;
    }
    elsif (($actual == 1) and ($predicted == 0)) {
        $hash{$id}{fn}++;
    }
    elsif (($actual == 0) and ($predicted == 0)) {
        $hash{$id}{tn}++;
    }
    elsif (($actual == 0) and ($predicted == 1)) {
        $hash{$id}{fp}++;
    }
}

print Dumper(\%hash);

__DATA__
1   1  A12P P1234
1   0  A52Q P1234
1   1  M12P P8866
1   1  R50T P1222
1   1  A82L P8866
0   0  D83F P8866

打印:

$VAR1 = {
          'P1222' => {
                       'fn' => 0,
                       'fp' => 0,
                       'tn' => 0,
                       'tp' => 1
                     },
          'P1234' => {
                       'fn' => 1,
                       'fp' => 0,
                       'tn' => 0,
                       'tp' => 1
                     },
          'P8866' => {
                       'fn' => 0,
                       'fp' => 0,
                       'tn' => 1,
                       'tp' => 2
                     }
        };

关于散列的散列中的 Perl 计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30350747/

相关文章:

perl - Marpa 解析器库是否支持错误恢复?

php - 无法输出与数据库中相同的 md5 哈希值

java - HashMap 中哈希码冲突的确切原因

python - Python 上的 SHA-512 验证

javascript - jQuery 如何对 domElements 进行哈希处理以与 data() 一起使用?

perl - 无法在@INC 中找到 XML/XPath.pm

perl - 受限哈希更新不是原子的,只有 `lock_keys` 而不是 `lock_hash`

perl - 在 Mojolicious 中使用 AnyEvent run_cmd,我不断收到此错误 : "AnyEvent::CondVar: recursive blocking wait attempted"

linux - 如何将两个命令的输出并行发送到标准输出?

c++ - 使用散列等长比较的子字符串