Arrays perl-如何在不使用变量进行比较的情况下替换数组中的空值?

Arrays perl-如何在不使用变量进行比较的情况下替换数组中的空值?,arrays,perl,suppress-warnings,is-empty,Arrays,Perl,Suppress Warnings,Is Empty,我有一个数组,其中每个元素来自由tab分隔的一行 初始代码: #!/usr/bin/perl -w use strict; 下面的代码是代码的一部分 sub parser_domains { my @params = @_; my $interpro_line = ""; my @interpro_vector = ( ); my $idr_sub_id = $params[0]; my $idr_sub_start = $params[1]+1; my $idr_sub_end = $p

我有一个数组,其中每个元素来自由tab分隔的一行

初始代码:

#!/usr/bin/perl -w
use strict;
下面的代码是代码的一部分

sub parser_domains {

my @params = @_;

my $interpro_line = "";
my @interpro_vector = ( );
my $idr_sub_id = $params[0];
my $idr_sub_start = $params[1]+1;
my $idr_sub_end = $params[2]+1;
my $interpro_id = "";
my $interpro_start_location = 0;
my $interpro_end_location = 0;
my $interpro_db = "";
my $interpro_length = 0;
my $interpro_db_accession = "";
my $interpro_signature = "";
my $interpro_evalue = "";
my $interpro_vector_size = 0;
my $interpro_sub_file= "";
my $idr_sub_lenght = ($idr_sub_end-$idr_sub_start)+1;

$interpro_sub_file = "$result_directory_predictor/"."$idr_sub_id/"."$idr_sub_id".".fsa.tsv";

#open file; if it fails, print a error and exits.
unless( open(TSV_FILE_DATA, $interpro_sub_file) ) {
        print "Cannot open file \"$interpro_sub_file\"\n\n";
        return;
}
my @interpro_file_line = <TSV_FILE_DATA>;
close TSV_FILE_DATA;

foreach $interpro_line (@interpro_file_line) {
    @interpro_vector = split('\t',$interpro_line);
    $interpro_id = $interpro_vector[0];
    $interpro_db = $interpro_vector[3];
    $interpro_db_accession = $interpro_vector[4];
    $interpro_start_location = $interpro_vector[6];
    $interpro_end_location = $interpro_vector[7];
    $interpro_signature = $interpro_vector[11];
    $interpro_length = ($interpro_end_location-$interpro_start_location) + 1;

    if ($interpro_signature eq ""){

            $interpro_signature = "NOPIR";
            printf IDP_REGION_FILE "\nFound a $interpro_db domain with no IPR: starts at $interpro_start_location and ends at $interpro_end_location\n";
            printf IDP_REGION_FILE "The size of $interpro_db domain in the sequence is $interpro_length\n";
            printf IDP_REGION_FILE "The IDR starts at $idr_sub_start and and ends at $idr_sub_end\n";
            printf IDP_REGION_FILE "The size of IDR is $idr_sub_lenght\n";
            domains_regions($idr_sub_start,$idr_sub_end,$interpro_start_location,$interpro_end_location,$interpro_signature,$interpro_length,$interpro_db,$idr_sub_id,$interpro_db_accession,$idr_sub_lenght);
    }
    else{
        for $entry_line (@entry_file_line) {
            @entry_vector =  split('\t',$entry_line);
            $entry_ac = $entry_vector[0];
            $entry_type = $entry_vector[1];
            $entry_name = $entry_vector[2];
            chomp($entry_name);

            if ($interpro_signature eq $entry_ac) {
                printf IDP_REGION_FILE "\nFound a $interpro_db domain with Interpro Signature $entry_ac: starts at $interpro_start_location and ends at $interpro_end_location\n";
                printf IDP_REGION_FILE "The size of $interpro_db domain in the sequence is $interpro_length\n";
                printf IDP_REGION_FILE "The Interpro Signature $entry_ac belongs to type $entry_type\n";
                printf IDP_REGION_FILE "The name of $entry_ac is $entry_name\n";
                printf IDP_REGION_FILE "The IDR starts at $idr_sub_start and ends at $idr_sub_end\n";
                printf IDP_REGION_FILE "The size of IDR is $idr_sub_lenght\n";  

                domains_regions($idr_sub_start,$idr_sub_end,$interpro_start_location,$interpro_end_location,$interpro_signature,$interpro_length,$interpro_db,$idr_sub_id,$interpro_db_accession,$idr_sub_lenght);
            }
        }
    }
}
}
脚本工作得很好,但是比较
$interpro\u签名eq”“
提供了一个警告

Use of uninitialized value $interpro_signature in string eq at /home/duca/eclipse-workspace/idps/idp_parser_interpro.pl line 666.
因此,我搜索并尝试在比较之前将空值替换到数组中。我想要“NOIPR”的空值。 我正在研究9个完整的基因组,我有超过324000个蛋白质需要解析

如何替换数组中的空值


谢谢。

您的数组可能没有12个元素(或者第12个元素可能是
未定义的

/
是最新版本

错误
使用未初始化值
表示变量尚未初始化,或已设置为
undef

定期查看和使用它。定期使用
perl-Mdiagnostics…
对错误运行代码

使用警告
实际上比
-w
更好


对问题进行实质性编辑的更新

  • 从显示的数据来看,文件中似乎没有给出其他字段;所以用默认值证明所有变量,就像上面索引
    11
    处的数组元素一样。总之,这就是你想要做的。例如,如果文件中有所有字段,但有些字段可能为空(两个选项卡之间没有任何内容)

    这取决于列表中变量的顺序,变量容易出错;见下文。 如果某些字段根本不存在,那么可能还有(更多)工作要做

  • 有太多单独的变量,它们都是相关的,并命名为
    $interpro\u X
    (还有
    $idr\u Y
    $entry\u Z
    ,但数量较少且可能易于管理)

不能将它们捆绑到容器类型变量或数据结构中吗

哈希
%interpro
似乎很合适,带有键
X
(因此,
$interpro{id}
等)。然后,您可以更轻松地使用它们,并可以在整个批次上执行一些操作。在初始化时,您仍然需要注意顺序,因为它们是按顺序读取的,但这样应该更清楚。比如说

my @interpro_vars   = qw(id db db_accesssion ...);
my @interpro_vector = qw(id_default db_default ...);
my %interpro;
@interpro{@interpro_vars} = @interpro_vector;
# or simply
@interpro{qw(id db ...)} = qw(id_default db_default ...);
我首先用键和值定义了数组,然后使用它们,以防以后需要在数组中使用这些列表。如果不是这样,您可以使用列表(最后一行)初始化哈希

这里


是一种将
列表值列表
分配给
列表键
中给定的哈希
%h
的键集的方法。它们按照两个列表的给定顺序(大小最好匹配)一对一分配。hash的键前面有一个
@
符号,因为这里有一个键列表,而不是hash。请注意,散列必须在某处声明。请参阅。

您的数组可能没有12个元素(或者第12个元素可能是
未定义的

/
是最新版本

错误
使用未初始化值
表示变量尚未初始化,或已设置为
undef

定期查看和使用它。定期使用
perl-Mdiagnostics…
对错误运行代码

使用警告
实际上比
-w
更好


对问题进行实质性编辑的更新

  • 从显示的数据来看,文件中似乎没有给出其他字段;所以用默认值证明所有变量,就像上面索引
    11
    处的数组元素一样。总之,这就是你想要做的。例如,如果文件中有所有字段,但有些字段可能为空(两个选项卡之间没有任何内容)

    这取决于列表中变量的顺序,变量容易出错;见下文。 如果某些字段根本不存在,那么可能还有(更多)工作要做

  • 有太多单独的变量,它们都是相关的,并命名为
    $interpro\u X
    (还有
    $idr\u Y
    $entry\u Z
    ,但数量较少且可能易于管理)

不能将它们捆绑到容器类型变量或数据结构中吗

哈希
%interpro
似乎很合适,带有键
X
(因此,
$interpro{id}
等)。然后,您可以更轻松地使用它们,并可以在整个批次上执行一些操作。在初始化时,您仍然需要注意顺序,因为它们是按顺序读取的,但这样应该更清楚。比如说

my @interpro_vars   = qw(id db db_accesssion ...);
my @interpro_vector = qw(id_default db_default ...);
my %interpro;
@interpro{@interpro_vars} = @interpro_vector;
# or simply
@interpro{qw(id db ...)} = qw(id_default db_default ...);
我首先用键和值定义了数组,然后使用它们,以防以后需要在数组中使用这些列表。如果不是这样,您可以使用列表(最后一行)初始化哈希

这里


是一种将
列表值列表
分配给
列表键
中给定的哈希
%h
的键集的方法。它们按照两个列表的给定顺序(大小最好匹配)一对一分配。hash的键前面有一个
@
符号,因为这里有一个键列表,而不是hash。请注意,散列必须在某处声明。请参阅。

问题在于第三行仅包含9个元素。所以

@interpro_vector = split('\t',$interpro_line);
对于该行,仅将9个元素分配给
@interpro_vector
,但您随后访问
$interpro_vector[11]
(即第12个元素),而该元素不存在。您现在可以检查
@interpro_vector
是否包含(至少)12个元素:

if (@interpro_vector >= 12) {
    ...
}
或者,如果未定义
$interpro\u向量[11]
,则可以使用as使用默认值:

$interpro_signature = $interpro_vector[11] // '';
上述行相当于

if (defined $interpro_vector[11]) {
    $interpro_signature = $interpro_vector[11];
} else {
    $interpro_signature = '';
}
现在


将起作用。

问题是您的第三行仅包含9个元素。所以

@interpro_vector = split('\t',$interpro_line);
对于该行,仅将9个元素分配给
@interpro\u vector
,但您可以在中访问
$
$interpro_signature = $interpro_vector[11] // '';
if (defined $interpro_vector[11]) {
    $interpro_signature = $interpro_vector[11];
} else {
    $interpro_signature = '';
}
if ($interpro_signature eq "") {
    ...
}