map
に相当するハッシュはありますか?
my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;
キーをループできることはわかっています。
List :: Pairwise その構文を正確に実装すると主張しています-mapp
、grepp
を参照してください。私はそれを使ったことがありません。
また、あなたはそれをすることができます
%new_hash = map { new_key($_) => new_value($hash{$_}) } keys %hash;
%hash
が本当に$deeply->{buried}->{hash}
である場合、これは不器用に見えることを認めます。そのような場合は$temp = ...; map {...} keys %$temp
を使用することをお勧めします。
あなたがここで何をしようとしているのか本当にわかりません。 「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の代わりに大きな古いモジュールを使用する理由はゼロです。
次のようなマップを使用できます。
my $i = 0;
my %new_hash = map { $i ^= 1 ? new_key($_) : new_val($_) } %hash;
私のモジュールからmapn
を使用できます List :: Gen これを行うには:
use List::Gen 'mapn';
my %new_hash = mapn {new_key($_[0]) => new_value($_[1])} 2 => %old_hash;
mapn
はmapに似ていますが、追加の引数、つまりリストをウォークスルーする要素の数が必要です。ブロック内では、@_
配列は現在のスライスに設定されます。
$ 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'
};
@eugeneソリューションにコメントを追加することは許可されていないため、これを追加します。私はそれが好きですが、私にはうまくいきませんでした(値がmap
になることを確認するためにNaN
にprint $i
を追加します)それは次のように機能しました:
my $i = 0;
%hash = map { ($i=($i^1)+0) ? new_key($_) : new_val($_) } %hash;