4

今日渡されたこのコードのバリエーション(perlコーダーによって書かれた)、そしてそれは混乱しています:

   my $k = {3,5,6,8};
   my $y = {%$k};

なんで?それは何をしますか?それはこれと同じことのようです:

   my $y = $k;

コンテキストは、dbiモジュールを使用した呼び出しにあります。

               while (my $x = $db->fetchrow_hashref )
               {  $y{something} = {%$x};  }
4

2 に答える 2

8

違いは、同じメモリを参照せずにデータ構造を複製していることです。

例えば:

use strict;
use warnings;
use Data::Dumper;

my $h={'a'=>1,'b'=>2};
my $exact_copy=$h; #$exact_copy references the same memory as $h
$h->{b}++; #$h maps b to 3

print Dumper($exact_copy) . "\n"; #a=>1,b=>3

my $clone={%$h}; #We dereference $h and then make a new reference
$h->{a}++; #h now maps a to 2

print Dumper($clone) . "\n"; #a=>1,b=>3 so this clone doesn't shadow $h

ちなみに、( のように) すべてのコンマを使用して手動でハッシュを初期化するのmy $k = {3,5,6,8}は、非常に見苦しいものです。

于 2012-06-02T04:41:36.383 に答える
0

{ }、この場合は、ハッシュ コンストラクターです。新しいハッシュを作成し、それへの参照を返します。そう

比較

my $k = { a => 4 };
my $y = $k;
$k->{a} = 5;
print $y->{a};   # 5

my $k = { a => 4 };
my $y = { %$k };
$k->{a} = 5;
print $y->{a};   # 4
于 2012-06-02T05:03:53.793 に答える