Arrays perl-如何在不使用变量进行比较的情况下替换数组中的空值?
我有一个数组,其中每个元素来自由tab分隔的一行 初始代码: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
#!/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 "") {
...
}