免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1533 | 回复: 6
打印 上一主题 下一主题

leraning perl第六版 17章习题第一题疑问? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-17 17:06 |只看该作者 |倒序浏览
本帖最后由 无双六 于 2012-11-17 18:36 编辑

习题如下:
写一个程序,从文件中读入字符串,一行一个字符串,然后让用户输入模式,这个模式可能匹配上某些字符串。对于每一个模式,程序将指出文件中有多少个字符串(多少行)匹配上了,并指出是哪些。对于新的模式不需要重新读文件,将这些字符串保留在内存中。文件名可以直接写在程序之中。如果模式无效(例如,圆括号不匹配),则程序报告这个错误,并让用户继续尝试新的模式。当用户输入一个空行,则程序退出。
给出的答案如下:
  1. #!usr/bin/perl
  2. use 5.014;
  3. use utf8;
  4. use strict;

  5. my $filename = 'sample_text.txt';
  6. open my $fh, '<', $filename
  7.         or die "Can't open '$filename': $!";
  8. chomp(my@strings = <FILE>);
  9. while (1) {
  10.         print 'please enter a pattern:';
  11.         chomp (my$pattern = <STDIN>);
  12.         last if $pattern=~ /\A\s*\Z/;
  13.         my @matches = eval {
  14.                 grep /$pattern/, @strings;
  15.         };
  16.         if ($@) {
  17.                 print "Error: $@";
  18.         } else {
  19.                 my$count = @matches;
  20.                 print "there were $count matching stings:\n",
  21.                         map "$_\n", @matches;
  22.         }
  23.         print "\n";
  24. }
复制代码
我运行这个程序总是零匹配,而且在我看来貌似是错了,比如"<FILE>"是哪里来的。。

我自己写的如下:
  1. #!usr/bin/perl
  2. use 5.014;
  3. use utf8;
  4. use strict;
  5. use autodie;

  6. eval(open my$story_fh, '<', 'sample_text.txt');

  7. while (1) {
  8.         say "Please input your word:";
  9.         chomp(my$input = <STDIN>);

  10.         last if $input =~ /\A\s*\z/;
  11.         my@match = eval { grep /\b$input\b/i, <$story_fh> };
  12.         if ($@) {
  13.                 say "Error: $@";
  14.         } else {
  15.                 my$count = @match;
  16.                 print "$count successed match , they are:\n", @match, "\n";
  17.         }
  18. }
  19. close $story_fh;
复制代码
第一次匹配成功,但之后就都匹配失败,都是零次了。
望高人指点。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2012-11-17 18:03 |只看该作者
  1. chomp(my@strings = <$fh>);
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-11-17 18:42 |只看该作者
回复 2# rubyish


    那请问我自己写的代码错在哪呢

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
4 [报告]
发表于 2012-11-17 22:10 |只看该作者
本帖最后由 mcshell 于 2012-11-17 22:11 编辑

回复 3# 无双六


    你在循环中加入
  1. my @str = <$story_fh>;
  2.        
复制代码
然后输出@str,你看下结果。。
@str只会输出一次读取的文本值,第二次就为空。
你必须在循环之前读取@str,否则在循环中只会读取一次。

要么你把open放在循环中~

论坛徽章:
0
5 [报告]
发表于 2012-11-17 23:04 |只看该作者
楼上正确,这错误不应该啊:wink:

论坛徽章:
0
6 [报告]
发表于 2012-11-18 13:29 |只看该作者
回复 4# mcshell


    原来如此,多谢指点!

论坛徽章:
0
7 [报告]
发表于 2012-11-18 13:31 |只看该作者
回复 5# aku1


    一直是自己一个人在看书,对细节方面不是很熟悉,只能边用边学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP