Perl多维数组去重求助:如何提取唯一子数组
Perl多维数组提取唯一子数组的解决方案
问题核心是每个子数组都是独立的引用,即便元素完全一致,引用地址也不同,所以普通的uniq方法无法识别重复的子数组。以下是两种可行的解决方法:
方法一:用字符串拼接生成唯一键(适合简单子数组)
将每个子数组的元素拼接成一个唯一字符串,以此作为判断重复的依据:
use strict; use feature 'say'; use List::Util 'shuffle'; my @array = shuffle ( [4, 10], [5, 6], [1, 2], [1, 2], [1, 2] ); sub uniq_subarrays { my %seen; grep { my $key = join(',', @$_); !$seen{$key}++ } @_; } my @unique = uniq_subarrays(@array); foreach (@unique) {say "@$_";};
这种方法适合子数组仅包含字符串、数字等简单元素的场景,通过join把元素拼接成字符串(比如[1,2]转为"1,2"),相同内容的子数组会生成相同的键,从而被正确过滤。
方法二:用序列化生成唯一标识(适合复杂子数组)
如果子数组包含嵌套结构、对象或其他复杂元素,推荐用Storable模块的freeze函数序列化整个子数组,生成唯一的二进制字符串:
use strict; use feature 'say'; use List::Util 'shuffle'; use Storable 'freeze'; my @array = shuffle ( [4, 10], [5, 6], [1, 2], [1, 2], [1, 2] ); sub uniq_subarrays { my %seen; grep { my $key = freeze($_); !$seen{$key}++ } @_; } my @unique = uniq_subarrays(@array); foreach (@unique) {say "@$_";};
freeze会把整个数组引用的结构完整序列化为二进制字符串,能精准判断任意结构的子数组是否重复,兼容性更强。
内容的提问来源于stack exchange,提问作者Tiendu
相关产品推荐
相关产品推荐

