簡體   English   中英

Perl:%hash中的undef值-為什么?

[英]Perl: undef value in %hash — why?

下午好。 我正在將一些鍵和值寫入%hash中,但是我一直在獲得似乎無法解釋的undef值。

my @maxent_unchanged = <FILE1>; 
close FILE1;
chomp (@maxent_unchanged);

my @NM;
my @max_score_unchanged;
foreach my $line(@maxent_unchanged) {

  if ($line =~ m/[a-z]/i) {
    push (@NM, $line);
  }
  else { 
    push (@max_score_unchanged, $line);
  }
}

my %max_unchanged;
my $i = 0;
foreach my $lines(@maxent_unchanged) {
  $max_unchanged{$NM[$i]} = $max_score_unchanged[$i]; ##maxent score for unchanged seq
  $i++;
}

放在上下文中,@maxent_unchanged在@NM和@max_score_unchanged之間交替如下:

$VAR1 = 'TTAAGGCAGCCCACCCGCAGGCT        >       1       110740688       110740688       C       T       GCCTGGGCGGGGAGGGCTGTCACAGTGCCGGCAGCAGCCCTTAAGGCAGC[C]CACCCGCAGGCTGCCGAGCGCTACCTGTATTTCCCCAACTGGGCCATGGC splicing  splicing        SLC6A17:NM_001010898:exon12:c.1816-10C>T';
$VAR2 = '0.77';
$VAR3 = 'TTCTATCCTTTGTTTTACAGGAA        >       1       111857154       111857154       T       C       TTAAATGGAGGGAGTCCTGACTTTTGAAGTTTATCTGTTTCTATCCTTTG[T]TTTACAGGAACAGCCAGCTGAAAACTCTCCTGGCCATTGGAGGCTGGAAC splicing  splicing        CHIA:NM_201653:exon5:c.258-8T>C';
$VAR4 = '10.99';

因此,它(@maxent_unchanged)的行數是@NM和@max_score_unchanged的兩倍。 我已經檢查過了,它是正確的。

如果我對@NM和@max_score_unchanged進行數據轉儲,則會得到相同數量的變量,但是當我將它們放入%hash時,會得到一個額外的鍵值對,如數據轉儲哈希所示。

$VAR1 = '';
$VAR2 = undef;
$VAR3 = 'TTTTATTAATTCCTTTGTAGAAC        >       6       144835040       144835040       T       C       TATCATCTTAAATATTTCATATGGTTATGTAAGCATTTTATTAATTCCTT[T]GTAGAACCATCAGAACCAGCTAGAAATATTTGATGGGAACGTGGCTCACA splicing  splicing        UTRN:NM_007124:exon35:c.4945-5T>C';
$VAR4 = '8.22';
$VAR5 = 'TCTTTTTTGGACATGTACAGAGC        >       10      97127462        97127462        C       A       AGGAGTCTCTGAAGAAATTTCCGGAGTAGGGCTGATGGCTGAGCTCTGTA[C]ATGTCCAAAAAAGAAAAAAAAGAAGAAAAAAATAATGTAGATGATTTATT splicing  splicing        SORBS1:NM_001034957:exon13:c.1024-6G>T,NM_001034955:exon21:c.1972-6G>T,NM_001034956:exon18:c.1459-6G>T,NM_006434:exon13:c.1024-6G>T,NM_015385:exon17:c.1420-6G>T,NM_001034954:exon21:c.1906-6G>T,NM_024991:exon17:c.1147-6G>T';
$VAR6 = '4.43';

我的密鑰是唯一的,所以我知道這不是問題。 有什么想法嗎?

其次,由於要刪除空的哈希鍵和值,該怎么辦?

非常感謝您的耐心配合和提前幫助,E

在此循環中,您要遍歷@maxent_unchanged但應該遍歷@max_score_unchanged

foreach my $lines(@max_score_unchanged) {
  $max_unchanged{$NM[$i]} = $max_score_unchanged[$i]; ##maxent score for unchanged seq
  $i++;
}

@maxent_unchanged是您將所有數據加載到的內容,因此它的行數是@NM@max_score_unchanged

如果use strict; use warnings ,您將在運行時看到此錯誤:

Use of uninitialized value within @NM in hash element at test.pl line 25, <DATA> line 4.
Use of uninitialized value within @NM in hash element at test.pl line 25, <DATA> line 4.

這將指向正確的行。 您可以添加print "$i\\n"; 到該循環以查看它經歷了多少次,並將其與@NM@max_score_unchanged的長度進行比較。

我建議您在代碼中使用適當的縮進以使其更具可讀性。


例:

use strict;
use warnings;
use Data::Dumper;

my @maxent_unchanged = <DATA>;
chomp (@maxent_unchanged);

my @NM;
my @max_score_unchanged;

foreach my $line(@maxent_unchanged) {
    if ($line =~ m/[a-z]/i) {
        push (@NM, $line);
    }
    else { 
        push (@max_score_unchanged, $line);
    }
}

my %max_unchanged;
for (my $i = 0; $i < @max_score_unchanged; $i++ ) {
    $max_unchanged{$NM[$i]} = $max_score_unchanged[$i]; ##maxent score for unchanged seq
}

print Dumper \%max_unchanged;

__DATA__
TTAAGGCAGCCCACCCGCAGGCT        >       1       110740688       110740688       C       T       GCCTGGGCGGGGAGGGCTGTCACAGTGCCGGCAGCAGCCCTTAAGGCAGC[C]CACCCGCAGGCTGCCGAGCGCTACCTGTATTTCCCCAACTGGGCCATGGC splicing  splicing        SLC6A17:NM_001010898:exon12:c.1816-10C>T
0.77
TTCTATCCTTTGTTTTACAGGAA        >       1       111857154       111857154       T       C       TTAAATGGAGGGAGTCCTGACTTTTGAAGTTTATCTGTTTCTATCCTTTG[T]TTTACAGGAACAGCCAGCTGAAAACTCTCCTGGCCATTGGAGGCTGGAAC splicing  splicing        CHIA:NM_201653:exon5:c.258-8T>C
10.99

我還舉了一個示例,說明如何在for循環中使用索引進行迭代,而不是使用foreach循環,因為您在任何地方都不使用$lines


輸出:

$VAR1 = {
          'TTAAGGCAGCCCACCCGCAGGCT        >       1       110740688       110740688       C       T       GCCTGGGCGGGGAGGGCTGTCACAGTGCCGGCAGCAGCCCTTAAGGCAGC[C]CACCCGCAGGCTGCCGAGCGCTACCTGTATTTCCCCAACTGGGCCATGGC splicing  splicing        SLC6A17:NM_001010898:exon12:c.1816-10C>T' => '0.77',
          'TTCTATCCTTTGTTTTACAGGAA        >       1       111857154       111857154       T       C       TTAAATGGAGGGAGTCCTGACTTTTGAAGTTTATCTGTTTCTATCCTTTG[T]TTTACAGGAACAGCCAGCTGAAAACTCTCCTGGCCATTGGAGGCTGGAAC splicing  splicing        CHIA:NM_201653:exon5:c.258-8T>C' => '10.99'
        };

您是否真的需要將數據復制到多個陣列中? 在腳本的其他地方被使用。 如果沒有,那么我將在遍歷文件句柄時簡單地構建哈希。

use strict;
use warnings;
use Data::Dumper;

my %max_unchanged;

while (my $line = <DATA>) {
    chomp $line;
    if ($line =~ /^[ACGT]/) {
        chomp(my $value = <DATA>);
        $max_unchanged{$line} = $value;
    }
}

print Dumper \%max_unchanged;

__DATA__
TTAAGGCAGCCCACCCGCAGGCT        >       1       110740688       110740688       C       T       GCCTGGGCGGGGAGGGCTGTCACAGTGCCGGCAGCAGCCCTTAAGGCAGC[C]CACCCGCAGGCTGCCGAGCGCTACCTGTATTTCCCCAACTGGGCCATGGC splicing  splicing        SLC6A17:NM_001010898:exon12:c.1816-10C>T
0.77
TTCTATCCTTTGTTTTACAGGAA        >       1       111857154       111857154       T       C       TTAAATGGAGGGAGTCCTGACTTTTGAAGTTTATCTGTTTCTATCCTTTG[T]TTTACAGGAACAGCCAGCTGAAAACTCTCCTGGCCATTGGAGGCTGGAAC splicing  splicing        CHIA:NM_201653:exon5:c.258-8T>C
10.99

馬特正確指出了您出現問題的原因。 實際上,在這種情況下最好遍歷索引列表 ,像這樣

my %max_unchanged;
for my $i (0 .. $#max_score_unchanged) {
  $max_unchanged{$NM[$i]} = $max_score_unchanged[$i];
}

或者你甚至可以像這樣使用map

my %max_unchanged = map {
  $NM[$_] => $max_score_unchanged[$_];
} 0 .. $#max_score_unchanged;

但是最后,沒有明確的理由將文件分成兩個數組,您可能更喜歡程序更簡潔的版本,可以達到相同的目的。 它期望輸入文件作為命令行上的參數。

use strict;
use warnings;

my %max_unchanged;
while (my $key = <>) {
  next unless $key =~ /[a-z]/;
  chomp $key;
  chomp($max_unchanged{$key} = <DATA>);
}

use Data::Dump;
dd \%max_unchanged;

給定您的樣本輸入數據, %max_unchanged最終看起來像這樣

{
  "TTAAGGCAGCCCACCCGCAGGCT        >       1       110740688       110740688       C       T       GCCTGGGCGGGGAGGGCTGTCACAGTGCCGGCAGCAGCCCTTAAGGCAGC[C]CACCCGCAGGCTGCCGAGCGCTACCTGTATTTCCCCAACTGGGCCATGGC splicing  splicing        SLC6A17:NM_001010898:exon12:c.1816-10C>T" => 0.77,
  "TTCTATCCTTTGTTTTACAGGAA        >       1       111857154       111857154       T       C       TTAAATGGAGGGAGTCCTGACTTTTGAAGTTTATCTGTTTCTATCCTTTG[T]TTTACAGGAACAGCCAGCTGAAAACTCTCCTGGCCATTGGAGGCTGGAAC splicing  splicing        CHIA:NM_201653:exon5:c.258-8T>C"          => 10.99,
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM