2013-07-01 16 views
10

Nadal uczę się perla.Czy powinienem preferować hashe lub hashrefy w Perlu?

Dla mnie bardziej "naturalne" jest odwoływanie się do skrótów, niż bezpośredni dostęp do nich, ponieważ łatwiej jest przekazywać odniesienia do sub, (zamiast listy można podać jedną zmienną). Generalnie wolę takie podejście do tego, gdzie jeden bezpośredni dostęp %hashes”.

Pytanie brzmi, gdzie (w jakich sytuacjach) lepiej jest użyć zwykłego% mieszań, więc

$hash{key} = $value; 

zamiast

$href->{key} = $value 

Czy jest tu jakaś prędkość lub jakakolwiek inna "rzecz", która woli używać %hashes, a nie $hashrefs? Czy to jest kwestia wyłącznie osobistego gustu i TIMTOWTDI? Niektóre przykłady, kiedy lepiej jest używać %hash?

+4

W programie o dowolnej złożoności będziesz chciał przekazać te rzeczy do podprogramów lub metod, w którym to punkcie i tak będziesz konwertował je na referencje. Generalnie używam ishrefów, chyba że jest to jednorazowy skrypt jednorazowy. –

+0

Głosowanie w celu ponownego otwarcia ... to jest zdecydowanie pytanie, na które obiektywnie odpowiemy. – Zaid

Odpowiedz

9

Myślę, że tego rodzaju pytanie jest bardzo uzasadnione: języki programowania, takie jak Perl czy C++, przeszły długą drogę i zgromadziły wiele historycznych bagaży, ale ludzie zazwyczaj uczą się ich od ahistorycznych, synchronicznych exposé. W związku z tym zastanawiają się, dlaczego TIMTOWDI i WTF wszystkie te wybory, a co jest lepsze i co powinno być preferowane?

Tak więc, przed wersją 5, Perl nie miał referencji. Miał tylko typy wartości. Referencje są dodatkiem do Perla 4, umożliwiając zapisanie wielu rzeczy. Oczywiście konieczne było zachowanie typów wartości, aby zachować kompatybilność wsteczną; a także, dla uproszczenia, ponieważ często nie potrzebujesz pośrednictwa, do którego odnoszą się odniesienia.

Aby odpowiedzieć na to pytanie:

nie trać czasu na myślenie o prędkości hash list Perla. Są szybkie. To dostęp do pamięci. Uzyskując dostęp do bazy danych, systemu plików lub sieci, zazwyczaj Twój program zazwyczaj spędza czas.

Teoretycznie operacja dereferencji powinna zająć trochę czasu, więc mały nie powinien mieć znaczenia.

Jeśli jesteś ciekawy, to benchmark. Nie wyciągaj zbyt wielu wniosków z różnic, które możesz zauważyć. Wszystko może wyglądać inaczej w innej wersji.

Nie ma więc żadnego powodu, aby faworyzować odniesienia do typów wartości lub odwrotnie.

Czy jest jakikolwiek inny powód? Powiedziałbym, że to kwestia stylu i gustu. Osobiście wolę składnię bez akcesorów ->.

5

Jeśli możesz użyć zwykłych skrótów, aby opisać swoje dane, użyj zwykłego skrótu. Jednak gdy struktura danych stanie się nieco bardziej złożona, będziesz musiał użyć referencji.

Wyobraź sobie program, w którym przechowuję informacje o przedmiotach z magazynu i ile mam w magazynie. Prosty hash działa całkiem dobrze:

$item{XP232} = 324; 
$item{BV348} = 145; 
$item{ZZ310} = 485; 

Jeśli wszystko robisz jest stworzenie szybkich programów, które można odczytać pliku i przechowywać prostych informacji o raporcie, nie ma potrzeby stosowania odniesień w ogóle.

Jednak, gdy rzeczy stają się bardziej złożone, potrzebujesz referencji.Na przykład, mój program nie polega wyłącznie na śledzeniu moich zapasów, śledzę wszystkie aspekty moich zasobów. Elementy magazynu mają również nazwy, nazwę firmy, która je tworzy itd. W tym przypadku chcę, aby moje skróty nie wskazywały na pojedynczy punkt danych (liczbę elementów, które mam w magazynie), ale odwołanie do hasza :

$item{XP232}->{DESCRIPTION} = "Blue Widget"; 
$item{XP232}->{IN_STOCK}  = 324; 
$item{XP232}->{MANUFACTURER} = "The Great American Widget Company"; 

$item{BV348}->{DESCRIPTION} = "A Small Purple Whatzit"; 
$item{BV348}->{IN_STOCK}  = 145; 
$item{BV348}->{MANUFACTURER} = "Acme Whatzit Company"; 

można to zrobić wszelkiego rodzaju zwariowanych rzeczy zrobić coś takiego (jak mają oddzielne mieszań dla każdego pola lub umieścić wszystkie pola w jednym wartości oddzielone dwukropkiem), ale to jest po prostu łatwiejsze w użyciu odniesień do przechowywać te bardziej złożone struktury.

+0

Czy zdajesz sobie sprawę, że możesz usunąć '->'? Tak jak w: '$ item {XP232} {DESCRIPTION}' – shawnhcorey

2

Dla mnie głównym powodem używania $hashrefs do %hashes jest możliwość nadania im znaczących nazw (powiązany pomysł będzie nazwą odniesienia do anonimowego skrótu), co może pomóc w oddzieleniu struktur danych od logiki programu i ułatwieniu pracy czytać i utrzymywać.

Jeśli skończysz z wieloma poziomami referencji (refs to refs ?!), zaczniesz tracić tę czystą i czytelną przewagę. Jak również, w przypadku krótkich programów lub modułów, lub na wcześniejszych etapach rozwoju, gdzie ponownie testujesz rzeczy, bezpośredni dostęp do %hash może ułatwić proste debugowanie (instrukcje print itp.) I uniknąć przypadkowego "działania na odległość" "problemy, dzięki którym możesz skupić się na" iteracji "poprzez swój projekt, korzystając z odnośników tam, gdzie to właściwe.

Ogólnie uważam, że jest to świetne pytanie, ponieważ TIMTOWDI i TIMTOCWDI gdzie C = "poprawne". Dziękuję za pytanie i dziękuję za odpowiedzi.

Powiązane problemy