Ошибка perl: 'использование неинициализированного значения в конкатенации (.) или строке' с использованием хэша

У меня есть файл с разделителями табуляции: 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}; И почему он не будет хранить 2-й столбец abc.txt?

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
Другие вопросы по тегам