1

このサンプル データから分離された 2 つの数値を比較したい:

'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し、大きい方の値が新しい配列にプッシュされるようにしたいと考えています。

このようなもの:

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

4

1 に答える 1

2

コードを@condition_match1作成@condition_match2すると、一致するたびに、正規表現の 2 つのキャプチャ グループに対応する 2 つの要素で作成されます。しかし、これらの要素の 1 つは常に でありundefuninitialized ...警告が発生します。

|この場合、キャプチャ グループ内に配置することで、このプログラムを修復できます。

my ($condition1_match) = ($_ =~ /C1:.*?Change:(-?\d+\.\d+|-?inf)/);
my ($condition2_match) = ($_ =~ /C2:.*?Change:(-?\d+\.\d+|-?inf)/);

これにより、単一のキャプチャ グループが存在し、一致する操作によって単一の定義済み要素を含むリストが生成されます。

さらに、比較は

if (@condition1_match > @condition2_match) {

あなたが思っていることをしていない可能性があります。Perl では、2 つの配列間の数値比較は、配列の長さの比較です。どうやらあなたがしようとしていることは、これらの配列のそれぞれで定義された値を比較することなので、次のようなもっと面倒なことをする必要があります:

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;
}
于 2013-08-12T17:49:42.030 に答える