Я работаю над программой chet-bot в perl и регулярном выражении, но я не получаю желаемых результатов, поскольку вы видите, что у меня есть все местоимения и глаголы в хеше, и я прокручиваю строку, и если она соответствует хеш-ключу, то замените хэш-ключ значение с текущим значением подстроки.соответствие шаблону и регулярное выражение в perl?
вывод программы
Элиза: Привет, я психотерапевт. Как вас зовут?
адам: меня зовут адам
Элиза: Здравствуйте адам, как вы?
адам: я чувствую себя плохо
Элизу: Почему я чувствую себя плохо?
адам:, потому что я болен
Элиза: Почему, потому что вы болен?
независимо от «потому что» слово в последнем вопросе, но выход должен быть что-то вроде этого
Элизы: Почему, потому что вы больны?
любые предложения о том, как я могу решить эту проблему.
код:
sub makeQuestion{
my ($patient) = @_;
my %reflections = (
"am" => "are ",
"was" => "were ",
"i" => "you ",
"i'd" => "you would ",
"i've" => "you have ",
"i'll" => "you will ",
"my" => "your ",
"are" => "am ",
"you've"=> "I have ",
"you'll"=> "I will ",
"your" => "my ",
"yours" => "mine ",
"you" => "me ",
"me" => "you "
);
my @toBes = keys %reflections;
foreach my $toBe (@toBes) {
if ($patient =~/$toBe\b/)
{
$patient=~ s/$toBe /$reflections{$toBe}/i;
}
}
print "Why $patient? \n";
}
Это хороший подход к его гибкости. Его очень легко настроить, когда появятся новые потребности. Несколько комментариев. Для первого тестирования (с совпадением регулярных выражений) нет большой пользы для обработки (с заменой регулярного выражения) - если 's /' не соответствует, это не изменит его цель. Я думаю, что в этом случае '\ b' хватит в качестве якоря, и эти метки цикла делают его, возможно, менее читабельным (конечно, как вопрос вкуса). Однако они, безусловно, полезны в качестве демонстраций. – zdim
На самом деле, поскольку вы хорошо «раскалываете» слова сначала, нет оснований для привязки, поскольку слово проверено на слово. Но я предлагаю разделить любое количество пробелов, чтобы быть в безопасности. По умолчанию это шаблон '' ''(или, конечно, эквивалент'/\ s */'). Эти комментарии не предназначены для умаления ответа, который, я считаю, полезен и полезен :) – zdim
Спасибо за разъяснения zdin. Однако именно там я встречаю свои лимиты в perl: я хочу избежать множественных подстановок, поэтому я даю тест на месте: чтобы быть уверенным, что одно слово заменяется только один раз. Если я не использую этот тест, как я узнаю, что произошла замена, а затем остановить цикл, чтобы перейти к следующему слову? –