我有一组包含这样的数组:
sub pack_key {
return pack 'N' . ('w/a*' x @_), scalar(@_), @_;
}
因为我在散列中使用它们作为多值键(即:散列的键是数组)。
如果打包数组中的第一个n元素相同,是否有任何快速比较方法?或者反过来 - 比较最后的m个元素是否不同?
有一个明显的解决方案,即解包,并使用smartmatch运算符(~~),但我正在寻找直接在压缩数组上运行的东西。
感谢。
答案 0 :(得分:1)
因为你已经打包了嵌入长度的任意长度数据,所以答案是没有没有快速比较两个字符串的方法。你必须一次完成字符串一个组件。
这是一个有效的解决方案。
警告:这取决于您使用单字节字符编码安装Perl。这通常是正确的,但如果不是,请查看Encode以确保将这些字符串视为字节。
use strict;
use warnings;
my @arr1 = (1,2,3,4,5);
my @arr2 = (1,2,3,4,8);
sub pack_key {
return pack 'N' . ('w/a*' x @_), scalar(@_), @_;
}
sub n_elements_equal {
my ($compare_length,$k1,$k2) = @_;
my $length1 = unpack('N',$k1);
my $length2 = unpack('N',$k2);
if ($length1<$compare_length or $length2<$compare_length) { return 0; }
my $curr_pos = 4;
my $curr_element = 1;
while ($curr_element++ <= $compare_length)
{
my $el1 = unpack('w/a*',substr($k1,$curr_pos));
my $el2 = unpack('w/a*',substr($k2,$curr_pos));
if ($el1 ne $el2) { return 0; }
$curr_pos += (unpack('w',substr($k1,$curr_pos)) + 1);
}
return 1;
}
my $key1 = pack_key(@arr1);
my $key2 = pack_key(@arr2);
for (1..5)
{
print "First $_ elements are " .
(n_elements_equal($_,$key1,$key2) ? '' : 'not ') . "equal.\n";
}
这不仅仅是打开包装并进行智能匹配吗?如果你的数组很长,那么它会更快,因为你不必解压整个数组。它只会通过字符串,直到它确定匹配状态。如果数组不是很长,它可能不会为你节省任何东西。
通过改变您的设计来解决这个问题可能会更好。但这取决于你在做什么。