web-dev-qa-db-ja.com

Perlのハッシュのマップ

mapに相当するハッシュはありますか?

my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;

キーをループできることはわかっています。

16
Tim

List :: Pairwise その構文を正確に実装すると主張しています-mappgreppを参照してください。私はそれを使ったことがありません。

また、あなたはそれをすることができます

%new_hash = map { new_key($_) => new_value($hash{$_}) } keys %hash; 

%hashが本当に$deeply->{buried}->{hash}である場合、これは不器用に見えることを認めます。そのような場合は$temp = ...; map {...} keys %$tempを使用することをお勧めします。

17
Dallaylaen

あなたがここで何をしようとしているのか本当にわかりません。 「mapに相当するハッシュ」とはどういう意味ですか?ハッシュでmapを問題なく使用できます。キーが必要な場合は、keys;を使用してください。例えば"

@msglist = map { "value of $_ is $hash{$_}" } keys %hash    

通常は

「$ _の値は$ hash {$ _}」キー%hashと言います。

大丈夫です。

両方が必要な場合は、ハッシュ全体を使用してください。

割り当てについて、%new_hash = %old_hashの何が問題になっていますか?

ディープコピーの問題がありますか?次に、Storable::dcloneを使用します。

キーと値の両方をクロージャーで同時に使用できるようにしますか?次に、最初のマップでペアの束を作成します。

@pairlist = map { [ $_ => $hash{$_} ] } keys %hash  

これで何をしたいのかという例を見る必要がありますが、これまでのところ、基本的なPerlの代わりに大きな古いモジュールを使用する理由はゼロです。

8
tchrist

次のようなマップを使用できます。

my $i = 0;
my %new_hash = map { $i ^= 1 ? new_key($_) : new_val($_) } %hash;
6
Eugene Yarmash

私のモジュールからmapnを使用できます List :: Gen これを行うには:

use List::Gen 'mapn';

my %new_hash = mapn {new_key($_[0]) => new_value($_[1])} 2 => %old_hash;

mapnはmapに似ていますが、追加の引数、つまりリストをウォークスルーする要素の数が必要です。ブロック内では、@_配列は現在のスライスに設定されます。

4
Eric Strom

$ Perl -d/dev/null

  DB<2> %p = ( a=>'b', c=> 'd');                                                
  DB<5> p Dumper \%p                                                            
$VAR1 = {
          'c' => 'd',
          'a' => 'b'
        };

例:キーと値を逆にします。

  DB<6> %q = map { ($p{$_}, $_ ) } keys %p                                      
  DB<7> p Dumper \%q                                                            
$VAR1 = {
          'b' => 'a',
          'd' => 'c'
        };
3

@eugeneソリューションにコメントを追加することは許可されていないため、これを追加します。私はそれが好きですが、私にはうまくいきませんでした(値がmapになることを確認するためにNaNprint $iを追加します)それは次のように機能しました:

my $i = 0;
%hash = map { ($i=($i^1)+0) ? new_key($_) : new_val($_) } %hash;
0
basilest