Perl模块/子例程删除字符串的共享子字符串

时间:2019-06-10 13:27:24

标签: perl

给出一个字符串列表/数组(特别是UNIX路径),删除共享部分,例如:

  • ./ dir / fileA_header.txt
  • ./ dir / fileA_footer.txt

在使用该功能之前,我可能会删除目录,但严格说来不会有太大改变。

我想知道一种删除共享部分(./dir/fileA_)或删除非共享部分的方法。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:3)

这有点麻烦,但是如果您不需要支持Unicode字符串(也就是说,如果所有字符的值都小于256),则可以使用xor来获取最长公共前缀的长度。两个字符串:

my $n = do {
    ($str1 ^ $str2) =~ /^\0*/;
    $+[0]
};

您可以循环执行此操作以获取字符串列表的公共前缀:

use v5.12.0;
use warnings;

sub common_prefix {
    my $prefix = shift;
    for my $str (@_) {
        ($prefix ^ $str) =~ /^\0*/;
        substr($prefix, $+[0]) = '';
    }
    return $prefix;
}

my @paths = qw(
    ./dir/fileA_header.txt
    ./dir/fileA_footer.txt
);

say common_prefix(@paths);

输出:./dir/fileA_