我的输入文件中有一个字典单词列表,我正在尝试对一个单词进行模式匹配,该单词具有按顺序出现在单词中的所有元音(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
和badetikojuw.
不匹配的示例为ambeeiou
(在找到之前重复e完整模式的aeiou),0abstemiousness
(非字母0),Taeiou
(以大写字母开头),baEstmious
(未找到小写e
)。
答案 0 :(得分: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
答案 1 :(得分:2)
你正在跳过一半的输入。
每次出现都会读一行;你打电话给它两次。第一次将结果分配给$ _(默认代词),将其丢弃。
尝试放
while (my $word = <INFILE>)
避免丢弃所有其他输入行。
答案 2 :(得分:1)
您排除只有1 a
且出现在开头的情况。请注意,元音区分大小写,而其他字符则不区分。
由于你没有进行锚定匹配(匹配整个输入字符串,而不是允许匹配在输入字符串的中间任意开始和结束),你可以这样写:
/[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@#
进行匹配。