2010-01-08 30 views

cevap

30

Yalnızca kopyalayın: atama bu tür: sığ kopya merak edenler için

my $copy = { %$hash }; 

: Başka bir başvuru istiyorsanız

my %copy = %$hash; 

, sadece anonim karma yapıcı orijinal referansı genişletmek Üst seviye tuşlar için sadece yeni değerler oluşturur. Referans olan herhangi bir değer, yine de yeni karmada aynı referans olacaktır. Yani, orijinal karma değerini değiştirmeden yeni hashdaki bir değeri değiştirebilirsiniz. Yeni bir öğeyi anonim bir dizi değerine zorlamak gibi değeri yalnızca değiştirirseniz, her ikisi de aynı başvuruyu paylaştıkları için değişimleri alır. Bu nedenle, sığ kopyalar genellikle istediğiniz gibi değildir.

+1

Başvurulan bir hashın anonim bir kopyasını oluşturmak için, ilginç bir şekilde, sözdizimi '% {{% $ hash}}' dır. '% {% $ Hash} 'olarak çalışmıştım, bu da (kopyalama kısmı olmadan - Perl 5.8.8'de orjinal olarak referans alınmış bir hash verdi, ancak 5.16'da başarısız oldu) ... –

+0

$ a = $ hash; 'bir kopyası ref, yani aynı referans, sonra'% b =% $ hash; '(% d) bir referans değil, (dereferenced) karma dosyasının sığ bir kopyasıdır. daha sonra '$ c = {% $ hash}' adsız bir hash içinde genişletilmiş sığ kopyaya başvuruda bulunmak. Durumdayken '% {{$ $ hash}}' ifadesini kullandığınızda, en başta ilk derefence sonra anonim hashlara ve nihayetinde dış kargaşaya, yani sonunda bir referans olmayacak şekilde genişletin. – arhak

İlgili konular