Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:未定义%hash中的值--为什么?_Perl_Hash - Fatal编程技术网

Perl:未定义%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); }

下午好。我正在将一些键和值写入%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);
  }
  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;

英雄非常感谢。这么简单,却让一位年轻的女士很开心!英雄非常感谢。这么简单,却让一位年轻的女士很开心!