从字符串创建唯一值的数组的最佳方法是什么?

时间:2016-05-06 16:28:34

标签: perl

perl中是否有一个很好的衬里可以让你从字符串中创建一个唯一值数组?

property prop1(sig1,sig2,sig3,sig4);
    @(posedge clk)
    $fell(sig1) ##[1:$] first_match($fell(sig2)) ##0 sig3 |-> sig4 == sig3;
endproperty

我希望这个唯一的数组只包含“bob-2-4,bob-3-1”。

2 个答案:

答案 0 :(得分:5)

没有模块:

sub uniq { my %seen; grep !$seen{$_}++, @_ }

使用常用模块:

use List::MoreUtils qw( uniq );

用法:

my $str = "bob-2-4 asdfasdfasdf bob-2-4 asdfasdf bob-3-1";
my @unique = uniq $str =~ m/(bob-\d-\d)/g;
say for @unique;

答案 1 :(得分:1)

如果您正在谈论唯一身份用户,那么该工作的工具就是哈希。

你可以这样做:

#!/usr/bin/env perl
use strict;
use warnings;

my $str = "bob-2-4 asdfasdfasdf bob-2-4 asdfasdf bob-3-1";
my %unique = map { $_ => 1 } $str =~ m/(bob-\d-\d)/g;
print keys %unique;

作为一个衬垫,直接进入你的阵列,你可以:

my @unique = keys %{{map { $_ => 1 } $str =~ m/(bob-\d-\d)/g}};

这大致相同 - 使用map构造散列,然后使用keys来提取唯一值。注意 - keys不会返回已定义的订单。

如果排序很重要,您也可以使用grep,但您仍然需要哈希:

my $str = "bob-2-4 asdfasdfasdf bob-2-4 asdfasdf bob-3-1";
my %seen;
my @unique = grep { not $seen{$_}++ } $str =~ m/(bob-\d-\d)/g;
print @unique;