Perl學習筆記(2)----Regex數字匹配的一個疏忽

來源:互聯網
上載者:User

標籤:

  《Perl語言入門》第15章習題第2題如下:

用 given-when 結構寫一個程式,根據輸入的數字,如果它能被3整除,就列印“Fizz”;如果它能被5整除,就列印“Bin”;如果它能被7整除,就列印“Sausage”。比如,如果輸入15,程式就應該列印“Fizz”和“Bin”,因為15可以同時被3和5整除。思考一下,可以讓程式輸出“Fizz Bin Sausage”的最小數字該是多少?

自己寫的程式如下:

 #!/usr/bin/perl  2 use 5.010;  3 my $num;  4 while(chomp($num=<STDIN>)){  5         next unless $num =~ /\A\d+\.?\d+\z/;  #防止輸入的內容不是數字  6         given($num){  7                 when( not $_%3 ){  8                         print "Fizz ";  9                         continue; 10                 } 11                 when( not $_%5 ){ 12                         print "Bin "; 13                         continue; 14                 } 15                 when( not $_%7 ){ 16                         print "Sausage "; 17                         continue; 18                 } 19                 default { print "\n";} 20         } 21 }

結果啟動並執行時候,發現輸入 3 、5 、7 ,沒有任何輸出,而輸入 15、 35 、21 之類的數字,卻可以有 “Fizz Bin”、 “Bin Sausage” 之類的輸出,怎麼回事呢?

仔細推敲,原來問題出在第5行的Regex的代碼上:

該行代碼的本意是測試輸入的內容是否為數字,如果不是數字,則進入下一次迴圈,讀取下一次的輸入;但匹配的模式中,‘\d+‘ 要求至少匹配一個數字字元,則兩個‘\d+‘則要求至少匹配兩個數字字元。於是,當輸入為 3 、 5、 7 的時候,因為是單個數字字元,因而無法正常匹配,就進入了下一次的迴圈。解決方案是使用 ‘/\A\d+\.?\d?/‘ 這個模式進行匹配。

 #!/usr/bin/perl  2 use 5.010;  3 my $num;  4 while(chomp($num=<STDIN>)){  5         next unless $num =~ /\A\d+\.?\d?\z/;  #防止輸入的內容不是數字  6         given($num){  7                 when( not $_%3 ){  8                         print "Fizz ";  9                         continue; 10                 } 11                 when( not $_%5 ){ 12                         print "Bin "; 13                         continue; 14                 } 15                 when( not $_%7 ){ 16                         print "Sausage "; 17                         continue; 18                 } 19                 default { print "\n";} 20         } 21 }

 

問題解決!

Perl學習筆記(2)----Regex數字匹配的一個疏忽

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.