2009-07-21 11 views
22

Zostałem poproszony o zmodyfikowanie istniejącego kodu, aby dodać dodatkowe funkcje. Szukałem w Google i nie mogę znaleźć odpowiedzi. Mam coś w tej sprawie ...Jak używać skrótów jako argumentów dla podprogramów w Perlu?

%first_hash = gen_first_hash(); 
%second_hash = gen_second_hash(); 
do_stuff_with_hashes(%first_hash, %second_hash); 

sub do_stuff_with_hashes 
{ 
    my %first_hash = shift; 
    my %second_hash = shift; 

    # do stuff with the hashes 
} 

otrzymuję następujące błędy:

Odd number of elements in hash assignment at ./gen.pl line 85. 
Odd number of elements in hash assignment at ./gen.pl line 86. 
Use of uninitialized value in concatenation (.) or string at ./gen.pl line 124. 
Use of uninitialized value in concatenation (.) or string at ./gen.pl line 143. 

linii 85 i 86 są dwie pierwsze linie w rutynowych sub i 124 i 143, gdzie są Mam dostęp do skrótów. Kiedy sprawdzam te błędy, wydaje mi się, że moje hashe są niezainicjowane. Mogę jednak sprawdzić, czy wartości skrótów mają wartości. Dlaczego otrzymuję te błędy?

+1

To jest duplikat. Proszę spojrzeć na http://stackoverflow.com/questions/944784/ – innaM

Odpowiedz

24

Hasła są zwinięte w płaskie listy po przejściu do funkcji. Tak więc, po przesunięciu wartości z argumentów funkcji, otrzymujesz tylko jedną wartość. Tym, co chcesz zrobić, jest przekazanie skrótów przez odniesienie.

do_stuff_with_hashes(\%first_hash, \%second_hash); 

Ale musisz pracować z hashe jako odniesieniami.

my $first_hash = shift; 
my $second_hash = shift; 
+0

Widzę ... To podstęp ... Dziękuję bardzo! – predhme

5

pierwsze,

do_stuff_with_hashes(%first_hash, %second_hash); 

"strumienie" na skróty do listy, odpowiednik:

('key1_1', 'value1', ... , 'key1_n', 'value1_n', 'key2_1', 'value2_1', ...) 

a następnie wybrać jeden i tylko jeden z tych przedmiotów. Więc

my %first_hash = shift; 

jest jak powiedzenie:

my %first_hash = 'key1_1'; 
# leaving ('value1', ... , 'key1_n', 'value1_n', 'key2_1', 'value2_1', ...) 

Nie można mieć hash jak { 'key1' }, ponieważ 'key1' jest mapowanie do niczego.

+1

Dzięki za wyjaśnienie, co dzieje się za kulisami. – predhme

9

Hasła odniesienia są drogą do zrobienia, jak wskazali inni.

Udostępnienie innego sposobu na zrobienie tego tylko dla kopnięć ... ponieważ kto potrzebuje zmiennych tymczasowych?

do_stuff_with_hashes({ gen_first_hash() }, { gen_second_hash() }); 

Tu są tylko tworzenie odniesień skrótu w locie (poprzez nawiasów klamrowych wokół wywołań funkcji) do wykorzystania w funkcji do_stuff_with_hashes. To nic specjalnego, inne metody są równie ważne i prawdopodobnie bardziej jasne. Może to pomóc w podróży, jeśli zobaczysz tę aktywność w swoich podróżach jako ktoś nowy w Perlu.

+0

Świetna sztuczka! Idźcie dalej. – predhme

+0

Z przyjemnością. Jedną z rzeczy, o których należy pamiętać, jeśli pozostaniesz w Perlu, jest to, że wszyscy będą wskazywać, "Istnieje więcej niż jeden sposób, aby to zrobić". To rodzaj błogosławieństwa i przekleństwa) w zależności od twojego zdania o takich rzeczach) w programowaniu Perla. Baw się dobrze! –

14

Trochę późno, ale

Jak zostało powiedziane, należy zdać referencje, a nie mieszań.

do_stuff_with_hashes(\%first_hash, \%second_hash); 

Ale jeśli potrzebujesz/chcesz użyć swoich skrótów, możesz je usunąć bez problemu.

sub do_stuff_with_hashes { 
    my %first_hash = %{shift()}; 
    my %second_hash = %{shift()}; 
}; 
+0

jasne, nie odwołuję się z hashe, kopiuję je. – larelogio

Powiązane problemy