ELIZAのようなシンプルなチャプターボットプログラムを作成しています。perlの端末からの入力方法
私は端末から質問を受け取り、ダイアログで返信しますが、私のプログラムは最初の入力と繰り返しだけを受け取ります。
例えば、私は私のスクリプトを実行すると、出力はこのようなものになることがあります。
[Eliza]: Hi, I'm a psychotherapist. What is your name?
user Input: hello my name is adam.
[Eliza]: hello adam, how are you?
[Eliza]: your name is adam
[Eliza]: your name is adam
[Eliza]: your name is adam
[Eliza]: your name is adam
[Eliza]: your name is adam
、それが延々と繰り返されます。
私はどこが間違っているのか分かりません。だから、私のプログラムがキーボードから次の行を読み上げるようにするにはどうすればいいですか?
sub hello {
print "[Eliza]: Hi, I'm a psychotherapist. What is your name? \n";
}
sub getPatientName {
my ($reply) = @_;
my @responses = ("my name is", "i'm", "i am", "my name's");
foreach my $response (@responses) {
if (lc($reply) =~ /$response/) {
return "$'";
}
}
return lc($reply);
}
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"
);
if ($count == 0) {
$patientName = getPatientName($patient);
$count += 1;
print "Hello $patientName , How are you? \n";
}
my @toBes = keys %reflections;
foreach my $toBe (@toBes) {
if ($patient =~/$toBe/) {
$patient=~ s/$toBe/$reflections{$toBe}/i;
print "$patient? \n";
}
}
}
sub eliza {
hello();
my $answer = <STDIN>;
while ($answer) {
chomp $answer;
#remove . ! ;
$answer =~ s/[.!,;]/ /;
makeQuestion($answer);
}
}
eliza();
を参照してくださいあなたが必要とするすべては ''(私の$の答え=)しながら、あるようです。あなたが持っているものは、常に "真実"(それは続ける)であり、新しい入力を決して読み取ることはない(同じ印字を保つ)。 –
zdim
@zdim:「ループする」とは、一般的に 'for'文のようなリストを指していると思います。 – Borodin
@Borodin私は、その状態を新しいものが通り抜けることは何もないことを強調することを意図していました...しかし、それは正しいことです、 "ループオーバー"は 'while'に関しては本当に使用できません。 Heh。それを修正していただきありがとうございます。 – zdim