Как я могу сделать поиск ключа хеша без учета регистра? - PullRequest
9 голосов
/ 21 ноября 2008

Очевидно, что хеш-ключи сравниваются с учетом регистра.

$ 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

Есть ли настройка, чтобы изменить это для текущего скрипта?

Ответы [ 4 ]

17 голосов
/ 21 ноября 2008

Вам придется использовать связанный хеш. Например Hash :: Case :: Preserve .

8 голосов
/ 21 ноября 2008

Хэш строки и той же строки с измененным регистром не равны. Таким образом, вы не можете делать то, что хотите, не считая вызова «uc» на каждом хэш-ключе, прежде чем создавать его и ИСПОЛЬЗОВАТЬ.

5 голосов
/ 22 мая 2010
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";
1 голос
/ 31 октября 2014

grep должен сделать трюк, если вы сделаете сравнение шаблона без учета регистра:

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

Если у вас есть более одного ключа с различным правописанием, вам может потребоваться проверить, больше ли совпадение и равно 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...