2008-11-21 5 views
9

Offensichtlich Hash-Schlüssel werden unter Berücksichtigung der Groß-/Kleinschreibung verglichen.Wie kann ich Hash-Schlüssel-Lookup-Groß-und Kleinschreibung beachten?

$ 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 

Gibt es eine Einstellung, um das für das aktuelle Skript zu ändern?

Antwort

17

Sie müssen einen gebundenen Hash verwenden. Zum Beispiel Hash::Case::Preserve.

+0

Ich frage mich, was die Geschwindigkeit und Raumstrafen für diese Implementierung sind im Vergleich zu nur sicherzustellen, dass Leute ihre Hash-Schlüssel im richtigen Fall an erster Stelle bekommen? –

+0

Ich sollte nicht viel im Weltraum kosten, obwohl es definitiv in der Zeit kosten wird. Allerdings wird es in den meisten Fällen keine große Rolle spielen. –

8

Der Hash einer Zeichenfolge und die gleiche Zeichenfolge mit dem geänderten Fall sind nicht gleich. So können Sie nicht tun, was Sie wollen, kurz vor dem Aufruf von "uc" auf jedem Hash-Schlüssel, bevor Sie es erstellen und bevor Sie es verwenden.

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

Ich mag, wo Sie mit diesem gehen, aber wenn ich es in ActiveState Perl auf Win32 ausführen, bekomme ich "Nein". Ich denke, du meintest: (existiert $ lookup {(lc $ key)})? "Ja Nein" – mseery

0

grep sollte es tun, wenn Sie mit dem Muster übereinstimmen Fall machen unempfindlich:

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

Wenn Sie mehr als einen Schlüssel mit verschiedenen Rechtschreibung haben, können Sie überprüfen müssen, wenn das Spiel größer ist als 1 auch.

Verwandte Themen