String 在perl中比较两个字符串,找出不匹配的字符串和匹配的字符串,并对它们进行计数

String 在perl中比较两个字符串,找出不匹配的字符串和匹配的字符串,并对它们进行计数,string,perl,String,Perl,比较两个字符串,找出不匹配和不匹配的字符串,并对它们进行计数 string1 = "SEQUENCE" string2 = "SEKUEAEE" 我想要像这样的输出。使用不匹配和匹配计数 'SS' match 1 'EE' match 3 'UU' match 1 'QK' mismatch 1 'NA' mismatch 1 'CE' mismatch 1 适用于任意数量字符串的解决方案 use List::Util qw(max); use Perl6::Junction qw(all)

比较两个字符串,找出不匹配和不匹配的字符串,并对它们进行计数

string1 = "SEQUENCE"
string2 = "SEKUEAEE"
我想要像这样的输出。使用不匹配和匹配计数

'SS' match 1
'EE' match 3
'UU' match 1
'QK' mismatch 1
'NA' mismatch 1
'CE' mismatch 1

适用于任意数量字符串的解决方案

use List::Util qw(max);
use Perl6::Junction qw(all);

my @strings = qw(SEQUENCE SEKUEAEE);
my (%matches, %mismatches);
for my $i (0 .. -1 + max map { length } @strings) {
    my @c = map { substr $_, $i, 1 } @strings;
    if ($c[0] eq all @c) {
        $matches{join '', @c}++;
    } else {
        $mismatches{join '', @c}++;
    }
}
for my $k (keys %matches) {
    printf "'%s' match %d\n", $k, $matches{$k};
}
for my $k (keys %mismatches) {
    printf "'%s' mismatch %d\n", $k, $mismatches{$k};
}
__END__
'SS' match 1
'UU' match 1
'EE' match 3
'QK' mismatch 1
'NA' mismatch 1
'CE' mismatch 1

适用于任意数量字符串的解决方案

use List::Util qw(max);
use Perl6::Junction qw(all);

my @strings = qw(SEQUENCE SEKUEAEE);
my (%matches, %mismatches);
for my $i (0 .. -1 + max map { length } @strings) {
    my @c = map { substr $_, $i, 1 } @strings;
    if ($c[0] eq all @c) {
        $matches{join '', @c}++;
    } else {
        $mismatches{join '', @c}++;
    }
}
for my $k (keys %matches) {
    printf "'%s' match %d\n", $k, $matches{$k};
}
for my $k (keys %mismatches) {
    printf "'%s' mismatch %d\n", $k, $mismatches{$k};
}
__END__
'SS' match 1
'UU' match 1
'EE' match 3
'QK' mismatch 1
'NA' mismatch 1
'CE' mismatch 1

这里有一个使用旧Perl的解决方案。也适用于任意数量的字符串

use warnings;
use strict;
use List::AllUtils qw( mesh part count_by pairs );

my @strings = ("SEQUENCES", "SEKUEAEES", "SEKUEAEES"); 

my $i = 0;

print join "",
    map { $_->[0] . " " . ($_->[1] > 1 ? 'match' : 'mismatch') . " " . $_->[1] ."\n" }
    pairs
    count_by { $_ }
    map { join "", @$_ }
    part { int($i++/scalar @strings) } 
    &mesh( @{[ map { [ split // ] } @strings ]} ) 
;
这里是Perl 6中的类似代码,以供比较

my @strings = "SEQUENCES", "SEKUEAEES", "SEKUEAEES"; 

([Z] @strings>>.comb)
    .map({ .join })
    .Bag
    .map({ "{.key} { .value > 1 ?? 'match' !! 'mismatch' } {.value}\n" })
    .join
    .say;

这不是很好吗?

这里有一个旧Perl的解决方案。也适用于任意数量的字符串

use warnings;
use strict;
use List::AllUtils qw( mesh part count_by pairs );

my @strings = ("SEQUENCES", "SEKUEAEES", "SEKUEAEES"); 

my $i = 0;

print join "",
    map { $_->[0] . " " . ($_->[1] > 1 ? 'match' : 'mismatch') . " " . $_->[1] ."\n" }
    pairs
    count_by { $_ }
    map { join "", @$_ }
    part { int($i++/scalar @strings) } 
    &mesh( @{[ map { [ split // ] } @strings ]} ) 
;
这里是Perl 6中的类似代码,以供比较

my @strings = "SEQUENCES", "SEKUEAEES", "SEKUEAEES"; 

([Z] @strings>>.comb)
    .map({ .join })
    .Bag
    .map({ "{.key} { .value > 1 ?? 'match' !! 'mismatch' } {.value}\n" })
    .join
    .say;

这不是很好吗?

使用非核心但非常方便的模块


使用非核心但非常方便的模块


我可以编写一个脚本来实现这一点,但是如何从数组、哈希或文本文件中获取这些字符串?您尝试了什么?你有什么问题?请向我们展示您的代码。我可以编写一个脚本来完成此操作,但您是如何从数组、哈希或文本文件中获取这些字符串的?您尝试了什么?你有什么问题?请显示您的代码。您可能有更多的UTIL,但我有所有的UTIL。哈哈哈。(见下文)@Holli,这让我想利用
List::EvenMoreUtils
。你可能有更多util,但我有所有util。哈哈哈。(见下文)@Holli让我想利用
List::EvenMoreUtils