2011-04-24 17 views

答えて

15

List::Pairwiseは、その構文を正確に実装すると主張しています。mappgreppを参照してください。私はそれを使用していない。

また、私は%hashは本当に$deeply->{buried}->{hash}ある場合clumsierに見える認める

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

としてそれを行うことができます。このような場合は$temp = ...; map {...} keys %$tempを使用することをお勧めします。

+1

'リスト::ペアごと:: mapp'作品すばらしいです。 – Tim

5

あなたはこのようにマップを使用することができます。

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

申し訳ありませんが、私の例は特別なケースでした。私は 'new_key'と' new_val'をキーと値の両方の関数にしたいと思います。 (これは、私が尋ねた質問に答えます。) – Tim

3

あなたがこれを行うに私のモジュールList::Genからmapnを使用することができます。

use List::Gen 'mapn'; 

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

mapnは、それを除いて、それは追加の引数を取り、マップのようなものです、リストを歩く要素の数ブロック内では、@_配列が現在のスライスに設定されます。

+0

ありがとう、それはさらに一般的です。 – Tim

5

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

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

が、通常は

は言う";。

だけで結構です

あなたは両方をしたい場合、その後、全体のハッシュを使用しています。

割り当てについては、%new_hash = %old_hashと間違って何ですか?

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

キーと値の両方をクロージャで同時に使用しますか?そして、最初のマップでペアの束を作る:

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

私はあなたがこれをしたいと思うものの例を参照する必要がありますが、これまでのところ、私はいくつかの大きな古いモジュールを使用しての代わりにゼロ原因を見ることができます基本的なPerl。例えばへ

+0

私は 'keys'を使うよりエレガントな代替手段を探していました。 'List :: Pairwise'と' List :: Gen'は、提案されているように、そのようなものを提供します。任務が決してなかったので、それはおそらく誤解です。プログラムを単純化するためにモジュールを使用する価値があるのは、それが味の問題だと思います。 – Tim

+0

@Tim:List :: Genはいくぶん面白いようですが、私の人生でList :: Pairwiseを使う理由を考えることはできません。なぜなら、 'map {"は$ _ = > $ h {$ _} "} keys%h'は完全に明白です。つまり、私は自分自身が順序付けされたペアリストを頻繁に構築していることを知っています。 – tchrist

3

$ 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' 
     }; 
+0

質問やその他の回答に見られるように、私は鍵をループすることができることを知っています。私は別の解決策があるかどうかを探していました。 (それはList :: Pairwiseでした。) – Tim

0

私は@eugeneソリューションにコメントを追加できないため、これを追加します。 それはこのように働いた (値がNaNなったことを確認するためにmapprint $iを追加)私はそれが好き、それは私のために動作しませんでした:

my $i = 0; 
%hash = map { ($i=($i^1)+0) ? new_key($_) : new_val($_) } %hash; 
関連する問題