• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Perl学习笔记(2)----正则表达式数字匹配的一个疏忽

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  《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行的正则表达式的代码上:

该行代码的本意是测试输入的内容是否为数字,如果不是数字,则进入下一次循环,读取下一次的输入;但匹配的模式中,'\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 }

 

问题解决!


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
perl输出中文有乱码发布时间:2022-07-22
下一篇:
perl中$1$2代表的含义发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap