Хотя многое можно сделать, чтобы исправить это (не связанное с вопросом), но вот минимальное необходимое решение:
use 5.010;
use strict;
use warnings;
my %hash = (
Dominic => 'Melbourne',
Stella => 'Beijing',
Alex => 'Oakland',
);
print "Enter name: ";
my $name = <STDIN>;
print "Enter place: ";
my $place = <STDIN>;
if ($name and $place) {
chomp ($name, $place);
if (exists($hash{$name}) and ($place eq $hash{$name})) {
print "Correct!\n";
} else {
print "NO!\n";
}
} else {
print "ERROR: Both name and place required to make this work!";
}
Когда вы читаете из STDIN, вам нужно проверить правильность ввода, в противном случае вы получите эти проблемы в своем результате (не говоря уже о «Исправить!» В конце) с неожиданным вводом:
Enter name:
Enter place:
Use of uninitialized value $name in chomp at original.pl line 19.
Use of uninitialized value $place in chomp at original.pl line 19.
Use of uninitialized value $name in hash element at original.pl line 22.
Use of uninitialized value $name in string eq at original.pl line 22.
Use of uninitialized value in string eq at original.pl line 22.
Use of uninitialized value $place in hash element at original.pl line 22.
Use of uninitialized value $place in string eq at original.pl line 22.
Use of uninitialized value in string eq at original.pl line 22.
Correct!
Вместо этого должно быть сгенерировано с проверенным кодом ошибки:
Enter name:
Enter place:
ERROR: Both name and place required to make this work!
PS: Пожалуйста, примите мои изменения объявления переменных, это просто OCD от меня, не связанного с рассматриваемым вопросом. Как я уже сказал, многое можно сделать.