22

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

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

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

4

5 に答える 5

21

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

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

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

私が認めるの%hashは、本当に$deeply->{buried}->{hash}。私はそのような場合に使用することを好み$temp = ...; map {...} keys %$tempます。

于 2011-04-24T08:13:24.417 に答える
11

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

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

通常は

say "value of $_ is $hash{$_}"  keys %hash;

大丈夫です。

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

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

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

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

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

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

于 2011-04-24T18:56:15.547 に答える
6

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

my $i = 0;
my %new_hash = map { $i ^= 1 ? new_key($_) : new_val($_) } %hash;
于 2011-04-24T08:13:50.767 に答える
4

mapn私のモジュールList::Genからこれを行うことができます:

use List::Gen 'mapn';

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

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

于 2011-04-24T17:06:18.113 に答える
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'
        };
于 2012-10-12T12:01:20.797 に答える