1

設定されていないリストのハッシュがあります。

ハッシュに追加する最後のブロックが実際に入力で呼び出されていることを確認しました。キーが存在しない場合はシングルトンリストを追加するか、存在する場合はリストの最後(右のキーの下で参照)にプッシュする必要があります。

GOTOが醜いことは理解していますが、コメントアウトしており、効果はありません。

問題は、printhitsが呼び出されたときに、ハッシュに値がないかのように何も出力されないことです。私もそれぞれ(%genomehits)を試しましたが、サイコロはありません。

ありがとう!

#!/usr/bin/perl
use strict;
use warnings;

my $len = 11; # resolution of the peaks

#$ARGV[0] is input file
#$ARGV[1] is call number
# optional -s = spread number from call
# optional -o specify output file name
my $usage = "see arguments";
my $input = shift @ARGV or die $usage;
my $call = shift @ARGV or die $usage;
my $therest = join(" ",@ARGV) . " ";
print "the rest".$therest."\n";
my $spread = 1;
my $output = $input . ".out";
if ($therest =~ /-s\s+(\d+)\s/) {$spread = $1;}
if ($therest =~ /-o\s+(.+)\s/) {$output = $1;}

# initialize master hash
my %genomehits = ();

foreach (split ';', $input) {
    my $mygenename = "err_naming";
    if ($_ =~ /^(.+)-/) {$mygenename = $1;}

    open (INPUT, $_);
    my @wiggle = <INPUT>;

    &singlegene(\%genomehits, \@wiggle, $mygenename);

    close (INPUT);
}

&printhits;

#print %genomehits;
sub printhits {
    foreach my $key (%genomehits) {
        print "key: $key , values: ";
    foreach (@{$genomehits{$key}}) {
        print $_ . ";";
    }
    print "\n";
    }
}

sub singlegene {
 # let %hash be the mapping hash
 # let @mygene be the gene to currently process
 # let $mygenename be the name of the gene to currently process

    my (%hash) = %{$_[0]};
    my (@mygene) = @{$_[1]};
    my $mygenename = $_[2];

    my $chromosome;
    my $leftbound = -2;
    my $rightbound = -2;

    foreach (@mygene) {
        #print "Doing line ". $_ . "\n";

        if ($_ =~ "track" or $_ =~ "output" or $_ =~ "#") {next;}

        if ($_ =~ "Step") {
            if ($_ =~ /chrom=(.+)\s/) {$chromosome = $1;}
            if ($_ =~ /span=(\d+)/) {$1 == 1 or die ("don't support span not equal to one, see wig spec")};
            $leftbound = -2;
            $rightbound = -2;
            next;
        }

        my @line = split /\t/, $_;
        my $pos = $line[0];
        my $val = $line[-1];

        # above threshold for a call
        if ($val >= $call) {
            # start of range
            if ($rightbound != ($pos - 1)) {
                $leftbound = $pos;
                $rightbound = $pos;
            }
            # middle of range, increment rightbound
            else {
                $rightbound = $pos;
            }

            if (\$_ =~ $mygene[-1]) {goto FORTHELASTONE;}
        }
        # else reinitialize: not a call
        else {
            FORTHELASTONE:
            # typical case, in an ocean of OFFs
            if ($rightbound != ($pos-1)) {
                $leftbound = $pos;
            }
            else {
            # register the range
                my $range = $rightbound - $leftbound;
                for ($spread) {
                    $leftbound -= $len;
                    $rightbound += $len;
                }
                #print $range . "\n";

                foreach ($leftbound .. $rightbound) {
                    my $key = "$chromosome:$_";
                    if (not defined $hash{$key}) {
                        $hash{$key} = [$mygenename];
                    }
                    else { push @{$hash{$key}}, $mygenename; }
                }
            }
        }

    }

}
4

2 に答える 2

4

%genomehits関数への参照を渡し、singlegene実行するときにそれを新しいハッシュにコピーしますmy (%hash) = %{$_[0]};%hash次に、関数の最後で消える値を追加します。

これを修正するには、参照を矢印表記で直接使用します。例えば

my $hash = $_[0];
...
$hash->{$key} = yadda yadda;
于 2009-06-09T15:29:18.633 に答える
2

私はそれがこの行だと思います:

my (%hash) = %{$_[0]};

参照を渡していますが、このステートメントはハッシュのコピーを作成しています。シングルジーンで行ったすべての追加は、戻ったときに失われます。

ハッシュ参照として残しておけば、機能するはずです。

PS-Data :: Dumperは、大きなデータ構造が期待どおりに動作していない場合の友です。これらのいくつかをあなたのコードに振りかけます...

use Data::Dumper; print Dumper \%genomehash;

于 2009-06-09T15:26:10.747 に答える