ハッシュの各キーに複数の値があります。ここでは、各キーの値を出力します
print "$var:",join ',',@{$hash{$var}},"\n";
上記の print ステートメントの出力は次のとおりです。
ABC:1,2,3,1,4,2,
DEF:9,3,4,5,3,5,
ここで、値の重複を削除したいと思います。望ましい出力は、
ABC:1,2,3,4
DEF:9,3,4,5
誰かがこれで私を助けることができますか?
ありがとう
ハッシュの各キーに複数の値があります。ここでは、各キーの値を出力します
print "$var:",join ',',@{$hash{$var}},"\n";
上記の print ステートメントの出力は次のとおりです。
ABC:1,2,3,1,4,2,
DEF:9,3,4,5,3,5,
ここで、値の重複を削除したいと思います。望ましい出力は、
ABC:1,2,3,4
DEF:9,3,4,5
誰かがこれで私を助けることができますか?
ありがとう
個人的には、List::MoreUtilsの uniq がこれを処理する方法が気に入っています。サブルーチンは非常に単純で、そのままでも、モジュールを通してでも使用できます。
my %seen;
my @dedupe = grep { not $seen{$_}++ } @{$hash{$var}};
モジュールのサブルーチンは次のようになります。
sub uniq (@) {
my %seen = ();
grep { not $seen{$_}++ } @_;
}
このコードは、リストの最初の順序を保持します。
@$_ = uniq @$_ foreach values %hash;
配列から重複する値を削除しようとしている場合は、これを使用できます
#!/usr/bin/perl -w
use strict;
my @array = ('a','b','c','c','e');
my %hash = map { $_ => 1 } @array;
my @out = keys %hash;
printf("%s",join(',',@out));
それがハッシュにあることは無関係です。やりたいことは、配列内の値を重複排除することです。
uniq()
List::MoreUtils モジュールの関数を見てください http://search.cpan.org/dist/List-MoreUtils/
次のように自分で行うこともできます。
my %h = map {($_,1)} @array_with_dupes;
my @deduped_array = keys %h;
これはすべて、 "Data: Arrays" の下 の Perl FAQで広くカバーされています。