gpt4 book ai didi

perl - perl 中的模式匹配和正则表达式?

转载 作者:行者123 更新时间:2023-12-02 09:21:48 26 4
gpt4 key购买 nike

我正在 Perl 和正则表达式中开发 chet-bot 程序,但我没有得到想要的结果,正如你所看到的,我在哈希中拥有所有代词和动词,我正在循环遍历字符串,如果它匹配哈希键,则替换哈希键值与当前子字符串值。

程序输出
伊丽莎:嗨,我是一名心理治疗师。你叫什么名字?
亚当:我的名字是亚当
伊丽莎:亚当你好,你好吗?
亚当:我感觉很糟糕
伊丽莎:为什么你感觉不好?
亚当:因为我病了
伊丽莎:为什么是因为你生病了?

无论上一个问题中的“因为”一词如何,但输出应该是这样的

伊丽莎:为什么是因为你生病了?
有关如何解决此问题的任何建议。

代码:

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";
}

最佳答案

您的代码会进行循环替换,因为它始终处理整个短语。它替换了一个单词,只是为了稍后替换那个替换。 answer by David Verdin解释它并展示解决此问题的方法。

这是另一种方式

my $phrase =  join ' ', map { $reflections{$_} // $_ } split ' ', $patient;

split 生成的单词列表被馈送到 map ,它将 block 中的代码应用于每个。在 block 内,当前处理的元素默认为 $_ variable .

如果该单词是哈希中具有已定义值的键,则返回该值,否则返回该单词本身。这是通过 //(defined-or operator)实现的。 。因此,具有哈希键的所有单词都会被相应的值替换,而其他单词则保持不变。他们的顺序也被保留,因此我们可以根据需要处理单词列表。

然后该输出列表用空格连接,形成要在前面添加 'Why '

的短语

请注意,split 中的模式 ' ' 与任意数量的空白相匹配。它通常用于“按空格”分割字符串(分解为“单词”),并且是 split 的默认设置。


我想添加对发布代码中使用的正则表达式的注释。您不需要先测试匹配才能进行替换。你可以这样做

foreach my $item (@list) {
$item =~ s/$pattern/$repl/;
}

如果 $pattern$item 中的不匹配,则不会发生任何情况,$item 不会发生变化。

关于perl - perl 中的模式匹配和正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42018775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com