通过perlsub和perlop联机操作页面,我注意到那里有许多"魔法"和"魔法"的引用(只搜索其中任何一个"魔法").我想知道为什么Perl如此丰富.
一些例子:
print ++($foo = 'zz') # prints 'aaa'
printf "%d: %s", $! = 1, $! # prints '1: Operation not permitted'
while (my $line = <FH>) { ... } # $line is tested for definedness, not truth
use warnings; print "0 but true" + 1 # "0 but true" is a valid number!
Run Code Online (Sandbox Code Playgroud) 我开始深入研究Perl,但是在编写"Perl-ly"代码时遇到了麻烦,而不是在Perl中编写C语言.如何更改以下代码以使用更多Perl习语,我应该如何学习习语?
只是解释它正在做什么:这个程序是一个模块的一部分,它对齐DNA或氨基酸序列(如果你关心这些事情,使用Needelman-Wunch).它创建了两个2d数组,一个用于存储两个序列中每个位置的分数,另一个用于跟踪路径,因此可以在以后重新创建得分最高的对齐.它工作正常,但我知道我并没有非常简洁明了地做事.
编辑:这是作业.我完成了它,但想要清理一下我的代码.如果您有兴趣,可以在课堂网站上找到有关实施算法的详细信息.
sub create_matrix {
my $self = shift;
#empty array reference
my $matrix = $self->{score_matrix};
#empty array ref
my $path_matrix = $self->{path_matrix};
#$seq1 and $seq2 are strings set previously
my $num_of_rows = length($self->{seq1}) + 1;
my $num_of_columns = length($self->{seq2}) + 1;
#create the 2d array of scores
for (my $i = 0; $i < $num_of_rows; $i++) {
push(@$matrix, []);
push(@$path_matrix, []);
$$matrix[$i][0] = $i * $self->{gap_cost};
$$path_matrix[$i][0] = 1;
}
#fill out the first row …Run Code Online (Sandbox Code Playgroud) 考虑一下这个Perl代码
my @a=[[1]];
print $a[0][0];
**output**
ARRAY(0x229e8)
Run Code Online (Sandbox Code Playgroud)
为什么打印ARRAY而不是1?我本来希望@a创建一个大小为1的数组,引用第二个只包含一个元素的数组1.
我认为对于有经验的人来说这应该很容易解决,对我来说虽然我在谷歌上尝试和搜索这个但是找不到适合我情况的东西.我只想让$ amountok和$ amountko给出它们在索引0和1处的值,但它不是这样的(参见#mark).
print ERGEBNIS "ID;Amount;Amount OK;Amount KO\n";
foreach my $key (keys %elementhash){
my $sum = 0;
foreach $valueofkey(@{$elementhash{$key}}){
$sum += $valueofkey;
}
#my $amountok= @{$elementhash{$key}[0]};
#my $amountko= @{$elementhash{$key}[1]};
print ERGEBNIS $key.";".$sum.";".$amountok.";".$amountko."\n";
}
Run Code Online (Sandbox Code Playgroud)
这会让我错误:"不能使用字符串"7"作为数组引用.",这必须是可能的,但我只是不知道如何!感谢你们
这是%elementhash的Dumper输出:
$VAR1 = { '1000' => [7],
'2000' => [5],
'3000' => [56, 12]
};
Run Code Online (Sandbox Code Playgroud)