Использование пробела в значении ключа для хеширования в perl - PullRequest
0 голосов
/ 07 октября 2018

Можем ли мы безопасно использовать хеш-таблицы, где значение ключа будет содержать пробелы между ними.Например:

my $key1="Dave 2314";
my $key2="John 3212";

$newhash{$key1}= 35;
$newhash{$key2}= 46;

Я использовал похожий фрагмент кода в одной из моих программ.Я чувствую, что хеширование работает, но существующая функция не работает хорошо =>

print "Found\n" if (exists $newhash{$searchKey}) 

Это дает абсурдные результаты.Иногда это работает хорошо и возвращает правильный ответ, если ключ присутствует, а иногда нет для того же самого ввода.Является ли наличие пробелов в клавишах причиной такого абсурдного функционирования?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Спасибо всем за ваше время.Проблема была в самом моем коде.Вся логика была основана на флаговой переменной, которую я не сбрасывал должным образом, как и когда это было необходимо.Таким образом, чтобы ответить на мой собственный вопрос, пробелы между ключевой строкой не должны быть проблемой.

0 голосов
/ 07 октября 2018

Какие абсурдные результаты вы получаете?Хэш не волнует, что у вас есть в ключах.Вы уверены, что у вас есть правильная вещь в $searchKey?Если вы берете это из пользовательского ввода, есть ли дополнительный конец строки в конце?

Это работает так, как должно:

my %newhash;

my $key1="Dave 2314";
my $key2="John 3212";

$newhash{$key1} = 35;
$newhash{$key2} = 46;

print "Found\n" if exists $newhash{$key1};

Но есть другая проблема.Вы можете иметь код в фигурных скобках для простого доступа к элементу хеша.Когда у вас есть только скалярная переменная, это работает.Это синтаксическая ошибка, потому что есть простое слово Dave, пробел и буквальное число 1234:

print "Found\n" if exists $newhash{Dave 2314};

Это не синтаксическая ошибка, потому что есть функция с именем Dave(это просто возвращает ключ, который существует).Я уверен, что это не ваша проблема:

sub Dave { 'John 3212' }
print "Found\n" if exists $newhash{Dave 2314};

Написано по-другому:

sub Dave { 'John 3212' }
print "Found\n" if exists $newhash{ Dave(2314) };

И еще по-другому:

print "Found\n" if exists $newhash{ join ' ', qw(John 3212 ) };

Вы должны иметьпроцитировал этот ключ, если он был буквальным:

print "Found\n" if exists $newhash{'Dave 2314'};

Вы можете иметь строки без кавычек, если они не похожи на код.Это выглядит как 'Dave':

print "Found\n" if exists $newhash{Dave};

Но как насчет этого?Эта точка на самом деле является оператором объединения строк, и она думает, что Dave - пустое слово.Если вы не определили подпрограмму, это синтаксическая ошибка:

print "Found\n" if exists $newhash{Dave.John};

Это работает, хотя.Объект перед точкой - это вызов подпрограммы, а после - строка:

sub Dave { 'John 3212' }
print "Found\n" if exists $newhash{Dave.John};

Так что есть некоторые странные крайние случаи.Но у меня обычно нет этой проблемы, потому что я всегда цитирую буквальные ключи.

...