或许下面会有所帮助:
use strict;
use warnings;
use Data::Dumper;
my (%hash, $stringNum, @covariances);
while (<DATA>) {
chomp;
my $i = 0;
$stringNum++;
$hash{ $i++ }{ lc $_ } = 1 for split //;
}
for my $position (sort { $a <=> $b } keys %hash) {
push @covariances, $position if values %{ $hash{$position} } == $stringNum;
}
print Dumper \@covariances;
print "\n", Dumper \%hash;
__DATA__
gccuucgggc
gacuucgguc
ggcuucggcc
输出:
$VAR1 = [
'1',
'8'
];
$VAR1 = {
'6' => {
'g' => 1
},
'3' => {
'u' => 1
},
'7' => {
'g' => 1
},
'9' => {
'c' => 1
},
'2' => {
'c' => 1
},
'8' => {
'c' => 1,
'u' => 1,
'g' => 1
},
'1' => {
'c' => 1,
'a' => 1,
'g' => 1
},
'4' => {
'u' => 1
},
'0' => {
'g' => 1
},
'5' => {
'c' => 1
}
};
的脚本构建哈希,其中的键是字符串位置0 .. n
的哈希值,以及相关的值是引用跟踪在这些位置跟踪角色的散列。如果给定位置中的所有字符串中的字符不同,则与键相关的值的数量将等于字符串的数量,表示协方差。请注意,@covariances
包含1, 8
。哈希被转储以便您可以看到数据结构。
该脚本跟踪字符串的数量,并将split
的每个字符串转换为其字符,k将每个字符的键值保存在$i
中。如果每个字符串中存在不同的字符(values %{ $hash{$position} } == $stringNum
),for my $position (...
段按数字顺序遍历关键字,并且push
将关键字(字符串位置)重新写入@covariances
。
希望这会有所帮助!
[Levenshtein distance](http://en.wikipedia.org/wiki/Levenshtein_distance)? [Text :: Levenshtein](http://search.cpan.org/dist/Text-Levenshtein/Levenshtein.pm)将是我想的第一步。 – SparKot
@quinshi,你好,你能提供你正在寻找的示例输出吗? – Gabs00
您应该在程序中添加'use strict'和'使用warnings',使用'my'预先声明变量,并尝试使用带词法文件句柄的三参数'open'。从长远来看,所有这些都可以为您节省麻烦。有关一些解释,请参阅http://perlmaven.com/perl-tutorial。 – simbabque