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
。