LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1061|回复: 7

[已分析][常用]~~~SOS~~~程序分析~~~~

[复制链接]
发表于 2004-4-12 01:06:00 | 显示全部楼层 |阅读模式
1 : #!/usr/local/bin/perl
2 :
3 : while ($inputline = <STDIN>) {
4 : while ($inputline =~ /\b[A-Z]\S+/g) {
5 : $word = $&;
6 : $word =~ s/[;.,:-]$//; # remove punctuation
7 : for ($count = 1; $count <= @wordlist;
8 : $count++) {
9 : $found = 0;
10: if ($wordlist[$count-1] eq $word) {
11: $found = 1;
12: $wordcount[$count-1] += 1;
13: last;
14: }
15: }
16: if ($found == 0) {
17: $oldlength = @wordlist;
18: $wordlist[$oldlength] = $word;
19: $wordcount[$oldlength] = 1;
20: }
21: }
22: }
23: print ("Capitalized words and number of occurrences:n");
24: for ($count = 1; $count <= @wordlist; $count++) {
25: print ("$wordlist[$count-1]: $wordcount[$count-1]n");
26: }
这个程序是用来计算某文件中首字母大写的单词出现的次数的,我头都看大了,还是没能看懂
谁给我分析一下啊:help
发表于 2004-4-12 01:17:47 | 显示全部楼层
我觉得用hash比较好点
用数组太麻烦了
 楼主| 发表于 2004-4-12 01:24:38 | 显示全部楼层
谁给我讲解一下上面的程序哈:help
 楼主| 发表于 2004-4-12 22:24:15 | 显示全部楼层
谁来为我解惑啊
发表于 2004-4-13 01:25:02 | 显示全部楼层

  1. #!/usr/bin/perl -w

  2. while ($inputline = <STDIN> ) { [color=red]# 从标准输入取一行[/color]
  3.   while ($inputline =~ /\b[A-Z]\S+/g) { [color=red]# 遍历这一行的每一个大写字母开头的单词[/color]
  4.     $word = $&; [color=red]# $word=匹配的单词[/color]
  5.     $word =~ s/[;.,:-]$//; # remove punctuation
  6.     for ($count = 1; $count <= @wordlist;$count++) { [color=red]# 遍历@wordlist[/color]
  7.       $found = 0;
  8.       if ($wordlist[$count-1] eq $word) { [color=red]# 如果@wordlist里有$word[/color]
  9.         $found = 1;
  10.         $wordcount[$count-1] += 1; [color=red]# @wordcount的相应项加1[/color]
  11.         last;
  12.       }
  13.     }
  14.     if ($found == 0) { [color=red]# 如果@wordlist里没有$word[/color]
  15.       $oldlength = @wordlist;
  16.       $wordlist[$oldlength] = $word; [color=red]# 将$word加到@wordlist的最后[/color]
  17.       $wordcount[$oldlength] = 1; [color=red]# 将@wordcount的相应项置1[/color]
  18.     }
  19.   }
  20. }
  21. print ("Capitalized words and number of occurrences:\n");
  22. for ($count = 1; $count <= @wordlist; $count++) { [color=red]# 打印所有的单词[/color]
  23.   print ("$wordlist[$count-1]: $wordcount[$count-1]\n");
  24. }
复制代码

@wordlist  保存单词列表
@wordcount 保存单词出现的次数(和@wordlist对应)
主要是程序里的@wordlist、@wordcount、$word、$found之类的变量都没有声明,一开始看有点晕,不过程序的流程倒是挺简单的,可以说就程序的算法来说直观的一蹋胡涂

另外,这个程序循环的时候老是从1开始,总让人觉得不爽,$found应该初始化一下,要不然会有一个警告(-w的时候)
 楼主| 发表于 2004-4-13 01:53:08 | 显示全部楼层
十分感谢
我还问一下,for语句第一次执行的时候,@wordlist是否为空数组?
发表于 2004-4-13 18:50:53 | 显示全部楼层
最初由 justto 发表
我还问一下,for语句第一次执行的时候,@wordlist是否为空数组?

对呀,
所以在这里$found就没有初始化($found在for里面,而第一次的时候for循环根本没有执行)
 楼主| 发表于 2004-4-13 19:00:26 | 显示全部楼层
thanks
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表