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: 一致する単語の例は でありabstemiousnessaAbstemiousness一致badetikojuw.しない例はambeeiou(aeiou の完全なパターンが見つかる前に e を繰り返す)、0abstemiousness(文字 0 以外)、Taeiou(大文字で始まる)、baEstmious(小文字ではない) です。ケースe発見)。

4

3 に答える 3

3

どうですか

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

.*間にある 0 個以上の文字に一致するため、そのように書くことで母音の順序が確実になります。これは、1 行に 1 単語しかないことも前提としており、そのように思われます。

編集:

別:

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

入力の半分をスキップしています。

が出現するたびに 1 行が読み取られます。あなたはそれを2回呼び出しています。最初は結果を $_ (デフォルトの代名詞) に割り当てますが、これは破棄されます。

入れてみて

     while (my $word = <INFILE>) 

入力の 1 行おきに破棄しないようにします。

于 2013-03-12T04:15:44.807 に答える
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

デモ

上記の答えが行う唯一の前提は、前後の残りの単語au英字であることです。

文字列全体に英語の文字のみが含まれ、パターンがあることを確認したい場合は、固定された一致が必要です。

/^[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 に答える