2010-02-23 15 views
9

Say miałem coś takiego:Jak mogę utworzyć nową, pustą referencję skrótu w Perlu?

# %superhash is some predefined hash with more than 0 keys; 
%hash =(); 
foreach my $key (keys %superhash){ 
    $superhash{ $key } = %hash; 
    %hash =(); 
} 

byłyby wszystkie klucze superhash wskazują na ten sam hash pusty dostęp przez %hash lub byłyby różne pusty skróty?

Jeśli nie, w jaki sposób mogę się upewnić, że wskazują puste hashy?

+0

@toolic moje przeprosiny. Rzeczywisty kod, który miałem był nieco zbyt skomplikowany, aby go opublikować, więc przepisałem go na to pytanie. –

Odpowiedz

16

Musisz użyć operatora \, aby odwołać się do typu danych w liczbie mnogiej (tablica lub hasz), zanim będzie można zapisać go w jednym miejscu. Ale w podanym przykładowym kodzie, jeśli się powołuje, każdy będzie tym samym hash.

Sposób zainicjować swoją strukturę danych jest:

foreach my $key (keys %superhash) { 
    $superhash{ $key } = {}; # New empty hash reference 
} 

Ale inicjalizacji jak to jest w dużej mierze niepotrzebne w Perl powodu autovivification (tworzenie odpowiednich obiektów kontenerowych, gdy zmienna jest używana jako opakowanie).

my %hash; 

$hash{a}{b} = 1; 

Teraz %hash ma jeden klucz, 'a', który ma wartość anonimowego hashref, zawierający parę klucz/wartość b => 1. Tablice są automatycznie włączane w ten sam sposób.

+0

Uzgodnione. Nie trzeba nosić dodatkowego hasha około , gdy Perl go nie potrzebuje. – Zaid

+0

W jaki sposób uzyskać dostęp do kluczy wartości $ hash {a}? Kiedy próbuję 'foreach my $ rk (keys $ hash {a}) {...' to daje mi błąd: typ musi być hash –

+0

Ah Mam to: '$ deref = $ hash {a}', a następnie 'foreach $ key (keys% $ deref) {...' –

Powiązane problemy