2013-08-23 28 views
2

我有一个制表符分隔的文件:abc.txt。 ,其具有像数据:perl错误:'使用未初始化的值串联(。)或字符串'使用哈希

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的关键值。

但是$递减的输出是空白,我得到错误:

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

有什么不对my $desc = $blast{$mRNA};为什么不能将其存放的abc.txt的第2列?

+1

在文件中有实际的标签?使用'Data :: Dumper'在读取结构时转储结构并发布输出。 –

+0

@SinanÜnür 我检查了我的'abc.txt'文件。这是一个制表符分隔的文件。第一列是mRNA,第二列是描述。 – aki2all

+1

您是否打印过'$ mRNA'的值?你在'%blast'中打印过键(和值)吗?这是第一步。从表面上看,这个消息意味着'$ mRNA'中的值不是'%blast'中的关键字。 –

回答

4

对尾随的空白行和可能的非标签分离器下面的警卫(通过使用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 
+0

我必须将'%blast'的关键字与循环内的$ mRNA链接起来: 'for my $ mRNA(keys%{$ featureHash {$ scaffold} {$ gene}}){ }' 具有在'abc.txt'文件的关键值中相同的所有mRNA值。 那么,我将如何在循环内打印描述? – aki2all

+0

'print $ blast - > {$ mRNA};'...我无法评论你没有显示的数据。 –

相关问题