我有一个多维数组,我正在寻找一种方法来获取数组中唯一的元素。
use strict;
use feature 'say';
use List::Util 'shuffle';
#use List::MoreUtils 'uniq';
my @array = shuffle (
[4, 10],
[5, 6],
[1, 2],
[1, 2],
[1, 2]
);
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
};
my @unique = uniq(@array);
foreach (@unique) {say "@$_";};
但这不管用。似乎多维数组中的每个数组都是不同的引用。
我尝试使用来自MoreUtils的uniq,但它也不起作用。
请帮帮忙。
P/s:我在寻找一种生产4,101,2的方法。
发布于 2022-07-22 04:44:16
您必须在%seen
哈希中引用两个数组值:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use List::Util 'shuffle';
my @array = shuffle (
[4, 10],
[5, 6],
[1, 2],
[1, 2],
[1, 2]
);
sub uniq {
my %seen;
grep !$seen{$_->[0]}{$_->[1]}++, @_;
};
my @unique = uniq(@array);
foreach (@unique) {say "@$_";};
与嵌套的散列不同,您可以对这两个元素进行如下所示的字符串化:
grep !$seen{"$_->[0],$_->[1]"}++, @_;
对于任意数据结构数组的一般情况,可以序列化元素。此示例使用Storable::freeze
进行序列化。需要将$Storable::canonical
设置为true,以便对数据结构进行比较。见文档。正如@Ikegami所指出的,这仍然会导致浮点数的问题.
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use List::Util 'shuffle';
use Data::Dumper;
use Storable qw/freeze/;
#use List::MoreUtils 'uniq';
my @array = shuffle (
[4, 10],
[5, 6],
[1, 2],
[1, 2],
[1, 2],
[1,2,3],
[1,2,{foo=>'bar'}],
[1,2,{foo=>'bar'}],
[1,2,{foo=>'baz'}],
);
sub uniq {
my %seen;
local $Storable::canonical = 1;
grep !$seen{freeze( $_ )}++, @_;
};
my @unique = uniq(@array);
say Dumper \@unique;
https://stackoverflow.com/questions/73080186
复制相似问题