You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:48:22