Perl:未定义%hash中的值--为什么?
下午好。我正在将一些键和值写入%hash,但我一直得到一个似乎无法解释的未定义值Perl:未定义%hash中的值--为什么?,perl,hash,Perl,Hash,下午好。我正在将一些键和值写入%hash,但我一直得到一个似乎无法解释的未定义值 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); }
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\u unchanged的行数是@NM和@max\u score\u unchanged的两倍。我已经检查过了,它是正确的
如果我的数据转储@NM和@max_score_没有改变,我会得到相同数量的变量,但当我将它们放入%散列时,我会得到一个额外的键值对,如数据转储散列所示
$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\u上迭代,但您应该在@max\u score\u上迭代 @maxent_unchanged是您将所有数据加载到的内容,因此它的行数是@NM和@max_score_unchanged的两倍 如果你使用严格;并使用警告,您将在运行时看到此错误:
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.
我还举了一个例子,说明如何在for循环上使用索引进行迭代,而不是使用foreach循环,因为在任何地方都不使用$line
输出:
$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'
};
在这个循环中,您在@maxent_上进行迭代,但应该在@max_score_上进行迭代 @maxent_unchanged是您将所有数据加载到的内容,因此它的行数是@NM和@max_score_unchanged的两倍 如果你使用严格;并使用警告,您将在运行时看到此错误:
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.
我还举了一个例子,说明如何在for循环上使用索引进行迭代,而不是使用foreach循环,因为在任何地方都不使用$line
输出:
$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
您真的需要将数据复制到多个阵列中吗?正在脚本的其他位置使用。如果没有,那么我只需在文件句柄上循环时构建哈希
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];
}
my %max_unchanged = map {
$NM[$_] => $max_score_unchanged[$_];
} 0 .. $#max_score_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,
}
或者你甚至可以用地图,像这样
my %max_unchanged;
for my $i (0 .. $#max_score_unchanged) {
$max_unchanged{$NM[$i]} = $max_score_unchanged[$i];
}
my %max_unchanged = map {
$NM[$_] => $max_score_unchanged[$_];
} 0 .. $#max_score_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,
}
但最终没有明确的理由将文件拆分为两个数组,您可能更喜欢这个更简洁的程序版本,它可以达到相同的目的。它希望输入文件作为命令行上的参数
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;
马特正确地指出了你问题的原因。事实上,在这种情况下,最好迭代索引列表,如下所示
my %max_unchanged;
for my $i (0 .. $#max_score_unchanged) {
$max_unchanged{$NM[$i]} = $max_score_unchanged[$i];
}
my %max_unchanged = map {
$NM[$_] => $max_score_unchanged[$_];
} 0 .. $#max_score_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,
}
或者你甚至可以用地图,像这样
my %max_unchanged;
for my $i (0 .. $#max_score_unchanged) {
$max_unchanged{$NM[$i]} = $max_score_unchanged[$i];
}
my %max_unchanged = map {
$NM[$_] => $max_score_unchanged[$_];
} 0 .. $#max_score_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,
}
但最终没有明确的理由将文件拆分为两个数组,您可能更喜欢这个更简洁的程序版本,它可以达到相同的目的。它希望输入文件作为命令行上的参数
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;
英雄非常感谢。这么简单,却让一位年轻的女士很开心!英雄非常感谢。这么简单,却让一位年轻的女士很开心!