1

我的输入文件中有一个字典单词列表,并且我正在尝试对具有按该顺序出现在单词中的所有元音(a,e,i,o,u)的单词进行模式匹配。它们不必紧挨着。现在,这是我的代码:

open(INFILE, "words.txt") or die "Can't open word.txt: $!";
while(<INFILE>){
    $word = <INFILE>;
    if($word =~ /[a-z][a-zA-Z]*a[a-zA-Z]*e[a-zA-Z]*i[a-zA-Z]*o[a-zA-Z]*u[a-zA-Z]*/){
        print $word;
    }
}
close(INFILE);

但是即使我知道我的输入中有一个带有这种模式的单词,我也没有返回任何单词。我能解释一下为什么吗?这是为了家庭作业。

编辑:第一个字母必须小写,所有元音必须小写。另外,在搜索 aeiou 模式时,我不能重复。

EDIT2:将匹配的单词示例是abstemiousness,不匹配的示例是aAbstemiousness(在找到 aeiou 的完整模式之前重复 e),(非字母 0),(以大写字母开头),(不低于发现案例)。badetikojuw.ambeeiou0abstemiousnessTaeioubaEstmiouse

4

3 回答 3

3

怎么样

a.*e.*i.*o.*u

匹配中间的.*零个或多个字符,因此以这种方式编写它可以确保元音是有序的。这也假设每行只有一个单词,情况似乎如此。

编辑:

选择:

a\w*e\w*i\w*o\w*u

没有_和数字的替代方案:

a[a-z]*e[a-z]*i[a-z]*o[a-z]*u

连续没有重复元音的替代方案:

a[b-df-hj-np-tv-z] #repeat
于 2013-03-12T04:01:28.247 回答
2

您正在跳过一半的输入。

每次出现都会读取一行;你叫它两次。第一次将结果分配给 $_(默认代词),它被丢弃。

试着放

     while (my $word = <INFILE>) 

以避免丢弃所有其他输入行。

于 2013-03-12T04:15:44.807 回答
1

您排除了只有 1a并且它出现在开头的情况。请注意,元音区分大小写,而其他字符则不区分大小写。

由于您没有进行锚定匹配(匹配整个输入字符串,而不是允许匹配在输入字符串的中间任意开始和结束),您可以这样编写:

/[Aa][a-zA-Z]*[Ee][a-zA-Z]*[Ii][a-zA-Z]*[Oo][a-zA-Z]*[Uu]/

或者您可以打开不区分大小写的标志i

/a[a-z]*e[a-z]*i[a-z]*o[a-z]*u/i

演示

上面的答案唯一的假设是之前a和之后的其余单词u都是英文字母。

如果你想确保整个字符串只包含英文字母,并且有模式,你需要一个锚定匹配:

/^[a-z]*a[a-z]*e[a-z]*i[a-z]*o[a-z]*u[a-z]*$/i

这是最严格的形式,对单词中的所有字符进行验证,并且不允许@#$garblesdifdoup@#匹配。

于 2013-03-12T04:02:15.857 回答