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.
In reply to Re^3: Position Weight Matrix of Set of Strings
by BrowserUk
in thread Position Weight Matrix of Set of Strings
by monkfan
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |