【问题标题】:perl error: 'use of uninitialized value in concatenation (.) or string' using hashperl 错误:“在连接 (.) 或字符串中使用未初始化的值”使用哈希
【发布时间】:2013-08-23 14:36:32
【问题描述】:

我有一个制表符分隔的文件:abc.txt。 其中有如下数据:

Pytul_T015270   Protein of unknown function
Pytul_T015269   Protein of unknown function
Pytul_T015255   Protein of unknown function
Pytul_T015297   Protein of unknown function

我正在创建一个解析器,它将这个 abc.txt 和其他 2 个文件作为输入,并通过调用包中的不同子例程来解析文件:utility.pm

解析abc.txt的子程序在我的包中定义,utility.pm如下:

use strict;

sub readblast{

my $fileName = shift;
my %hash;
my %geneNameHash;

open PRED, $fileName or die "Can't open file $!\n";
while (my $line=<PRED>) {

    chomp $line;
    #print $line,"\n";
    (my $gene,my $desc) =  split /\t/, $line;

    $hash{$gene} = $desc;
}

close(PRED);

return %hash;
}

而我的使用哈希的parser.pl脚本如下:

my %blast=&utility::readblast($ARGV[2]);
for my $mRNA(keys %{ $featureHash{$scaffold}{$gene}}){
my $desc = $blast{$mRNA};
}

这里$featurehash 是我从另一个文件中生成的另一个哈希值。而$mRNA拥有文件abc.txt的键值。

但是 $desc 的输出是空白的,我得到了错误:

Use of uninitialized value $desc in concatenation (.) or string at parser.pl

my $desc = $blast{$mRNA}; 有什么问题,为什么不存储 abc.txt 的第 2 列?

【问题讨论】:

  • 文件中有实际的标签吗?阅读时使用Data::Dumper 转储结构并发布输出。
  • @SinanÜnür 我检查了我的abc.txt 文件。那是一个制表符分隔的文件。第一列是 mRNA,第二列是描述。
  • 你打印$mRNA的值了吗?您是否在%blast 中打印了键(和值)?这是第一步。从表面上看,该消息意味着$mRNA 中的值不是%blast 中的键。

标签: perl perl-hash


【解决方案1】:

以下措施可防止尾随空白行和可能的非制表符分隔符(通过使用 split 限制):

#!/usr/bin/env perl

package My::Utility;

use strict;
use warnings;

sub read_blast {
    my $fh = shift;

    my %hash;

    while (my $line = <$fh>) {
        chomp $line;
        last unless $line =~ /\S/;
        my ($key, $value) = split ' ', $line, 2;
        $hash{ $key } = $value;
    }

    return \%hash;
}

package main;

my $blast = My::Utility::read_blast(\*DATA);
while (my ($k, $v) = each %$blast) {
    print "'$k' => '$v'\n";
}

__DATA__
Pytul_T015270   Protein of unknown function
Pytul_T015269   Protein of unknown function
Pytul_T015255   Protein of unknown function
Pytul_T015297   Protein of unknown function

【讨论】:

  • 我必须将 %blast 的键与循环内的 $mRNA 链接起来:for my $mRNA(keys %{ $featureHash{$scaffold}{$gene}}){ } 它的所有 mRNA 值在 abc.txt 文件的键值中都相同。那么,如何在循环中打印描述?
  • print $blast-&gt;{$mRNA}; ... 我无法评论您未显示的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2014-05-20
相关资源
最近更新 更多