4

元の順序に関係なく、モジュールを使用せずに一意の配列を作成しようとしています。これがこれまでに思いついたものです。

my @arr = qw(b a a c d g e f);
my %hash;
@hash{@arr}=();
say keys %hash;
4

3 に答える 3

6

はい。ハッシュキーは一意であるため、これは慣用的な方法の 1 つです。同じことを達成する方法はたくさんあります。

List::MoreUtilsなどのモジュールを使用することもできます。

use strict;
use warnings;

use List::MoreUtils qw(uniq);
print join ":", uniq qw(a a a b b c d);

出力:

a:b:c:d

重複排除のいくつかの異なる方法:

my @arr = keys { map { $_ => 1 } qw(b a a c d g e f) };

中括弧は の匿名ハッシュをkeys作成し、map ステートメントはキーと値のペアのリストを作成します。


my @arr = dedupe(qw(a a b c d d e));

sub dedupe {
    my %hash = map { $_ => 1 } @_;
    return keys %hash;
}

同じことですが、サブルーチン形式で、2 行に分割されます。ハッシュは順序付けされていないため、両方のリストが半ランダムな順序になることに注意してください。

で使用されるサブルーチンList::MoreUtilsも同様に単純で、引数の順序が保持されるため、おそらく好ましいものです。ただし、まだハッシュを使用しています。

sub uniq {
    my %seen = ();
    grep { not $seen{$_}++ } @_;
}
于 2012-06-22T06:02:43.187 に答える
2

はい、正しい方法を使用していますが、一意の配列を作成する方法は他にもたくさんあります。

perlfaq4 を参照してください:リストまたは配列から重複した要素を削除するにはどうすればよいですか? 詳細については。

于 2012-06-22T06:18:46.250 に答える
1

セットとも呼ばれる順序付けのない一意の配列。「モジュールなし」と言ったことは知っています(なぜ?!)。しかし、気が変わったら、Set::Objectまたは試してみてくださいSet::Scalar

于 2012-06-22T06:45:15.767 に答える