2013-03-12 170 views
1

我有我的輸入文件中的字典單詞列表,我試圖模式匹配一​​個單詞,其中包含所有元音(a,e,i,o,u)出現在字按順序排列。他們不必緊挨着彼此。現在,這是我的代碼有:與Perl匹配的模式

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:將匹配單詞的一個示例是不匹配abstemiousnessaAbstemiousnessbadetikojuw.實例是ambeeiou(E的重複之前它發現AEIOU的完整圖案),0abstemiousness(非字母0),Taeiou (以大寫字母開頭),baEstmious(沒有發現小寫e)。

+1

只是一些建議,你應該使用三個參數打開。 'open(my $ infile,「<」,「words.txt」)',並在'while'循環中設置'my $ word'或者在裏面使用默認的'$ _'變量。我更喜歡'while(my $ word = <$infile>)'。 – squiguy 2013-03-12 04:02:09

+0

感謝您的提示!然而,你能解釋一下「<」是什麼嗎? – dtgee 2013-03-12 04:22:28

+0

這只是說「打開這個文件閱讀」。這裏有一個很好的鏈接,說明爲什麼這被認爲是Perl 5.6的最佳實踐。 https://www.informit.com/articles/article.aspx?p=1582932&seqNum=2 – squiguy 2013-03-12 04:27:32

回答

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 
+0

儘管這是一個簡單而簡單的解決方案,但如果在我的文字中有字母而不是字母,我不希望打印出結果。對不起,我忘了提及這一點。 – dtgee 2013-03-12 04:19:30

+0

謝謝!我讓我的程序工作! – dtgee 2013-03-12 04:59:49

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 

DEMO

ŧ他只假設上面的答案是,a之前和u之後的其餘部分都是英文字母。

如果你想確保整個字符串只包含英文字母,並具有模式,你需要一個固定匹配:

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

這是最嚴格的形式,以驗證對所有字符在單詞中,並且不允許@#[email protected]#匹配。

+0

嗨,我錯過了一些重要的要求,請你再看看我的文章嗎?我不確定如何解決這個問題,因爲這個模式在開始時可能包含或不包含a。我相信你的解決方案總是假定在開始時有一個。 – dtgee 2013-03-12 04:13:33

+0

@ user1831442:我不做這樣的假設。 – nhahtdh 2013-03-12 04:26:45

+0

嗯,你能解釋一下嗎?如果你把「a」放在前面並不意味着單詞中的第一個字符必須是a?那麼'u'後呢?如果在你後面有字母怎麼辦? – dtgee 2013-03-12 04:31:49

2

您正在跳過一半的輸入。

每次出現都會讀出一行;你叫它兩次。第一次將結果分配給$ _(默認代詞),丟棄該結果。

嘗試把

 while (my $word = <INFILE>) 

避免丟棄輸入的每一個其他線路。