in reply to Re^2: Position Weight Matrix of Set of Strings
in thread Position Weight Matrix of Set of Strings
The problem arises in this line my $n = $.;. $. (also known as $INPUT_LINE_NUMBER. See perlvar), is the record or line number of the last line read from a file.
In the original code that line came immediately after the while( my $line = <DATA> ) { loop, so $n was set to the number of lines in the file.
In your code/function, you are not reading from a file, therefore $. is 0, so $n gets set to 0, hence the error in this line:
$_ = map { $_ ? $_ / $n : 0 } @$_ for values %pwm; # Line 26
As you are passing the data into the function as a list and assigning it to an array, the equivalent value is the number of elements in the array. Eg. scalar @data;. So, modifying your code as
use Data::Dumper; my @inst = ( 'AAA', 'ATG', 'TTT', 'GTC' ); get_pwm(@inst); sub get_pwm { my @data = @_; my %pwm; foreach my $line (@data) { ++$pwm{ substr $line, $_, 1 }[$_] for 0 .. length($line) - 1; } my $n = @data; ### Modified @$_ = map { $_ ? $_ / $n : 0 } @$_ for values %pwm; # Line 26 print Dumper \%pwm; print "$_ => @{ $pwm{ $_ } }" for keys %pwm; return; }
Produces this output (assuming -l):
$VAR1 = { 'A' => [ '0.5', '0.25', '0.25' ], 'T' => [ '0.25', '0.75', '0.25' ], 'C' => [ 0, 0, '0.25' ], 'G' => [ '0.25', 0, '0.25' ] }; A => 0.5 0.25 0.25 T => 0.25 0.75 0.25 C => 0 0 0.25 G => 0.25 0 0.25
Not sure why you are outputting the results two different ways. It's also not typical to output from within a subroutine.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Position Weight Matrix of Set of Strings
by neversaint (Deacon) on Sep 07, 2006 at 02:31 UTC | |
by BrowserUk (Patriarch) on Sep 07, 2006 at 03:55 UTC | |
by monkfan (Curate) on Sep 19, 2006 at 01:05 UTC | |
by BrowserUk (Patriarch) on Sep 19, 2006 at 01:23 UTC |