2008-11-21 11 views
9

Najwyraźniej klawisze skrótów są porównywane z uwzględnieniem wielkości liter.Jak mogę uczynić klucz hashujący bez rozróżniania wielkości liter?

$ perl -e '%hash = (FOO => 1); printf "%s\n", (exists $hash{foo}) ? "Yes" : "No";' 
No 

$ perl -e '%hash = (FOO => 1); printf "%s\n", (exists $hash{FOO}) ? "Yes" : "No";' 
Yes 

Czy istnieje ustawienie umożliwiające zmianę tego dla bieżącego skryptu?

Odpowiedz

17

Będziesz musiał użyć powiązanego skrótu. Na przykład Hash::Case::Preserve.

+0

Zastanawiam się, jakie są ograniczenia prędkości i miejsca dla tej implementacji, a nie tylko upewnienie się, że ludzie otrzymają swoje klucze hashujące we właściwym przypadku? –

+0

Nie powinienem kosztować dużo w kosmosie, choć zdecydowanie będzie to kosztować w czasie. Powiedziawszy to, w większości przypadków nie będzie miało większego znaczenia IMHO. –

8

Mieszanie łańcucha i ten sam ciąg z zmienioną obudową nie są równe. Więc nie możesz zrobić tego, co chcesz, przed wywołaniem "uc" na każdym haśle przed jego utworzeniem I zanim go użyjesz.

5
my %hash = (FOO => 1); 
my $key = 'fOo'; # or 'foo' for that matter 

my %lookup = map {(lc $_, $hash{$_})} keys %hash; 
printf "%s\n", (exists $hash{(lc $key)}) ? "Yes" : "No"; 
+0

Podoba mi się, dokąd zmierzasz, ale kiedy uruchomię go w ActiveState Perl na Win32, otrzymuję "Nie". Myślę, że chodziło Ci o: (istnieje $ lookup {(lc $ key)})? "Tak nie" – mseery

0

grep powinno wystarczyć, jeśli uczynić wzorzec dopasowania wielkość liter ma znaczenie:

perl -e '%hash = (FOO => 1); printf "%s\n", (scalar(grep (/^foo$/i, keys %hash)) > 0) ? "Yes" : "No";'

Jeśli masz więcej niż jednego klucza z różnej pisowni może trzeba sprawdzić, czy mecz jest większa niż 1.