我想比较从此示例数据中分离出的两个数字:
'gi|112807938|emb|CU075707.1|_Xenopus_tropicalis_finished_cDNA,_clone_TNeu129d01 C1:TCONS_00039972(XLOC_025068),_12.9045:32.0354,_Change:1.3118,_p:0.00025,_q:0.50752 C2:TCONS_00045925(XLOC_029835),_10.3694:43.8379,_Change:2.07985,_p:0.0004,_q:0.333824',
'gi|115528274|gb|BC124894.1|_Xenopus_laevis_islet-1,_mRNA_(cDNA_clone_MGC:154537_IMAGE:8320777),_complete_cds C1:TCONS_00080221(XLOC_049570),_17.9027:40.8136,_Change:1.18887,_p:0.00535,_q:0.998852 C2:TCONS_00092192(XLOC_059015),_17.8995:35.5534,_Change:0.990066,_p:0.0355,_q:0.998513',
'gi|118404233|ref|NM_001078963.1|_Xenopus_(Silurana)_tropicalis_pancreatic_lipase-related_protein_2_(pnliprp2),_mRNA C1:TCONS_00031955(XLOC_019851),_0.944706:5.88717,_Change:2.63964,_p:0.01915,_q:0.998852 C2:TCONS_00036655(XLOC_023660),_2.31819:11.556,_Change:2.31757,_p:0.0358,_q:0.998513',
使用以下正则表达式:
#!/usr/bin/perl -w
use strict;
use File::Slurp;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
my (@log_change, @largest_change);
foreach (@intersect) {
chomp;
my @condition1_match = ($_ =~ /C1:.*?Change:(-?\d+\.\d+)|C1:.*?Change:(-?inf)/); # Sometimes the value is 'inf' or '-inf'. This allows either a numerical or inf value to be captured.
my @condition2_match = ($_ =~ /C2:.*?Change:(-?\d+\.\d+)|C2:.*?Change:(-?inf)/);
push @log_change, "@condition1_match\t@condition2_match";
}
print Dumper (\@log_change);
这给出了这个输出:
'1.3118 2.07985 ',
'1.18887 0.990066 ',
'2.63964 2.31757 ',
理想情况下,在同一个循环中,我现在想要在@condition1_match
和@condition2_match
中保存的值之间进行比较,以便将较大的值推送到新数组,除非与非数字进行比较'inf',在这种情况下推数值。
这样的事情:
my (@log_change, @largest_change);
foreach (@intersect) {
chomp;
my @condition1_match = ($_ =~ /C1:.*?Change:(-?\d+\.\d+)|C1:.*?Change:(-?inf)/);
my @condition2_match = ($_ =~ /C2:.*?Change:(-?\d+\.\d+)|C2:.*?Change:(-?inf)/);
push @log_change, "@condition1_match\t@condition2_match";
unless ($_ =~ /Change:-?inf/) {
if (@condition1_match > @condition2_match) {
push @largest_change, @condition1_match;
}
else {
push @largest_change, @condition2_match;
}
}
}
print Dumper (\@largest_change);
给出了:
'2.07985',
undef,
'0.990066',
undef,
'2.31757',
undef,
以及很多此错误消息:
Use of uninitialized value $condition2_match[1] in join or string at intersect.11.8.pl line 114.
我不确定错误消息的确切含义,以及为什么我在@largest_change
答案 0 :(得分:2)
在您编写代码时,@condition_match1
和@condition_match2
将创建2个元素 - 对应于正则表达式中的2个捕获组 - 每次匹配时。但其中一个元素必然是undef
,导致uninitialized ...
警告。
在这种情况下,您可以通过将|
置于捕获组内来修复此程序:
my ($condition1_match) = ($_ =~ /C1:.*?Change:(-?\d+\.\d+|-?inf)/);
my ($condition2_match) = ($_ =~ /C2:.*?Change:(-?\d+\.\d+|-?inf)/);
因此,只有一个捕获组,匹配操作会生成一个包含单个已定义元素的列表。
另外,比较
if (@condition1_match > @condition2_match) {
可能没有做你认为它正在做的事情。在Perl中,两个数组之间的数值比较是数组 length 的比较。你显然要做的是比较每个数组中定义的值,所以你需要做一些比较麻烦的事情:
my $condition1_match = $condition1_match[0] // $condition1_match[1];
my $condition2_match = $condition2_match[0] // $condition2_match[1];
if ($condition1_match > $condition2_match) {
push @largest_change, $condition1_match;
} else {
push @largest_change, $condition2_match;
}