【问题标题】:perl count mismatch between two stringsperl 计数两个字符串之间的不匹配
【发布时间】:2015-10-10 23:31:10
【问题描述】:

我只需要计算两个字符串之间的不匹配。让我们说:

my $s1 = "ATCG";
my $s2 = "ATTG"; 

这应该给出: 1 作为不匹配。无需查找位置或不匹配的内容。

我一直在寻找快速的方法。我认为拆分为数组并在循环中匹配或使用 substr 匹配每个位置可能会很慢,因为需要检查超过十亿对。谢谢

【问题讨论】:

标签: string perl mismatch


【解决方案1】:

只需将两个字符串异或即可。结果中的每个 NUL 字符表示两个字符串中的字符相同的位置。

my ($s1, $s2) = qw( ATCG ATTG );

my $count = ( $s1 ^ $s2 ) =~ tr/\0//c;

print "$count\n";   # Prints "1"

注意:如果您要反复比较一个字符串,请将它和您要比较的字符串传递给utf8::downgrade,以确保^ 尽可能快。

utf8::downgrade($s1);  # Change the internal format in which
utf8::downgrade($s2);  #   the strings are stored to speed up $s1^$s2.

如果任一字符串包含高于 U+00FF 的 UNICODE 字符,则这是无用/浪费的。

【讨论】:

  • 很好的答案,你能分享一下你的代码中^ 的使用以及它是如何工作的吗?
  • XOR 是一种按位运算符,用于查找位对之间的差异。所以这就变成了一个用 1 位或不完全由 0 位组成的字节来计算字节的问题。
  • 很棒的解决方案。我看起来像这样简洁。谢谢
  • 我这样说是为了对其他人也有用
  • @ikegami:ATCG会不会有什么问题,我用这个只是为了DNA?
猜你喜欢
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2021-02-15
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多