Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 距阵列的编辑距离百分比_Arrays_Perl_Loops_Bioinformatics_Edit Distance - Fatal编程技术网

Arrays 距阵列的编辑距离百分比

Arrays 距阵列的编辑距离百分比,arrays,perl,loops,bioinformatics,edit-distance,Arrays,Perl,Loops,Bioinformatics,Edit Distance,我试图从一组序列中获取编辑距离的百分比。到目前为止,这就是我所拥有的: #!/usr/bin/perl -w use strict; use Text::Levenshtein qw(distance); my @sequence = qw(CA--------W----------------------EKDRRTEAF---F------ CA--------W----------------------EKDRRTEAF---F------ CA--------S---------

我试图从一组序列中获取编辑距离的百分比。到目前为止,这就是我所拥有的:

#!/usr/bin/perl -w
use strict;
use Text::Levenshtein qw(distance);

my @sequence = qw(CA--------W----------------------EKDRRTEAF---F------ 
CA--------W----------------------EKDRRTEAF---F------ 
CA--------S-------------------SLVFGQGDNIQY---F------  
RA--------S-------------------SLIYSP----LH---F------);


foreach my $list (@sequence){
    my @distance = distance($list, @sequence);
    my @length = $list =~ tr/[A-Z]///;
}
我能够根据长度为
@length
的字母获得编辑距离和每个序列的长度。如果打印,结果如下所示:

@距离

0 0 13 14
0 0 13 14
13 13 0 11 
14 14 11 0
@length

13
13
16
12
由于
@length
的每一行与
@sequence
的每一行相等,因此在比较这两行时,我想使用最大的
@length
来获得百分比。因此,当第二个和第三个序列之间有一个编辑距离时,它将使用长度16而不是13来获得百分比。我认为需要做的是只调用
@length
数组中的两个元素,然后选择较大的元素放入百分比,可能使用
if
语句

我知道这个代码是错误的,但这通常是我的想法:

foreach my  $list (@sequence){
        my @distance = distance($list, @sequence);      
        my @length = $list =~ tr/[A-Z]//;                # / syntax hilite fix

        foreach my $item(@distance){
                foreach @length {
                        my $num1 = if $length[0] >= $length[1];
                                 print "$item/$num1\n";
                        else my $num2 = $length[1] >= $length[0];
                                print "$item/$num2\n";
                }
        }
}
答案应类似于以下内容:

0 0 .8125 1.0769 0 0 .8125 1.0769 .8125 .8125 0 .6875 1.0769 1.0769 .6875 0 0 0 .8125 1.0769 0 0 .8125 1.0769 .8125 .8125 0 .6875 1.0769 1.0769 .6875 0
试试这个。总而言之:我们计算了两个数据对之间的编辑距离 串。对于每一对,我们要确定距离的分数和最大字符数(
A-Z
)。最大字符数被视为该对中两个项目的最大字符数

use strict;
use warnings;

use Text::Levenshtein qw(distance);

my @sequence = qw(
        CA--------W----------------------EKDRRTEAF---F------
        CA--------W----------------------EKDRRTEAF---F------
        CA--------S-------------------SLVFGQGDNIQY---F------
        RA--------S-------------------SLIYSP----LH---F------
);

my @length = map { tr/[A-Z]// } @sequence;

for my $i (0..$#sequence) {
    my $list = $sequence[$i];
    my @distance = distance($list, @sequence);
    my $num1 = $length[$i];
    for my $j (0..$#distance) {
        my $item = $distance[$j];
        my $num2 = $length[$j];
        my $num = ( $num2 > $num1 ) ? $num2 : $num1;
        printf "%.4f ", $item/$num;
    }
    print "\n";
}
输出

0.0000 0.0000 0.8125 1.0769 
0.0000 0.0000 0.8125 1.0769 
0.8125 0.8125 0.0000 0.6875 
1.0769 1.0769 0.6875 0.0000 

干得好。顺便说一句,在带有正则表达式的行中添加类似于
#/
的注释将关闭文章其余部分的错误语法突出显示。有时你不得不使用它,这取决于正则表达式中的设置。在这里,我希望
#/
能做到这一点。@zdim谢谢。stackexchange.com使用。如果您愿意,我们可以尝试使用Perl语法高亮显示解决一些问题,以便(似乎我们需要用Javascript编写修补程序:)在挪威过一个愉快的圣诞节。感谢您的良好祝愿。我可能在俄勒冈州的一座山上瞥见了挪威,那里有雪足,阳光充足。(但不知怎么的,我觉得20华氏度太暖和了?)我希望你有一个愉快的假期。这是一个非常好的主意,实际上是为了解决问题!(我不知道怎么做。)至于JS,这将是我最终进入它的一个机会。@zdim嗨zdim。实际上,挪威的气候变化很大。我住在西海岸的卑尔根,这里不那么冷:)我从未去过俄勒冈州,但15年前我去过加利福尼亚。。。无论如何,我创建了一个谷歌代码美化GitHub库的分支。让我们继续讨论。再见。