字数统计程序有什么问题?

ale*_*kuk 1 testing perl count cpu-word

我的测试中有一个问题:

计算文件中行数和单词数的程序有什么问题?

open F, $ARGV[0] || die $!;
my @lines = <F>;
my @words = map {split /\s/} @lines;
printf "%8d %8d\n", scalar(@lines), scalar(@words);
close(F); 
Run Code Online (Sandbox Code Playgroud)

我的推测是:

  1. 如果文件不存在,程序将不会告诉我们.
  2. 如果文件中有标点符号,程序将对它们进行计数,例如,在

    abc cba
    , , ,dce
    
    Run Code Online (Sandbox Code Playgroud)

    将是五个字,但另一方面wc输出相同的结果,因此它可能被认为是正确的行为.

  3. 如果F是一个大文件,最好迭代线而不是将其转储到lines数组中.

你有什么不那么琐碎的想法吗?

cjm*_*cjm 5

在第一行,您有一个优先问题:

open F, $ARGV[0] || die $!;
Run Code Online (Sandbox Code Playgroud)

是相同的

open F, ($ARGV[0] || die $!);
Run Code Online (Sandbox Code Playgroud)

这意味着die如果文件名为false则执行,而不是open失败.你想说

open(F, $ARGV[0]) || die $!;
Run Code Online (Sandbox Code Playgroud)

要么

open F, $ARGV[0] or die $!;
Run Code Online (Sandbox Code Playgroud)

此外,您应该使用open的3参数形式,以防$ARGV[0]包含意味着什么的字符open.

open F, '<', $ARGV[0] or die $!;
Run Code Online (Sandbox Code Playgroud)

在另一个注释上,拆分/\s/意味着您在连续的空白字符之间得到一个"单词".您可能意味着/\s+/,或者作为amphetamachine建议,/\W+/取决于您想要如何定义"单词".

如果行以空格开头,那么仍然会出现空白"单词"的问题.您可以拆分' '以抑制它(这是一种特殊情况),或者您可以先修剪前导空格,或者插入一个grep { length $_ }清除空的"单词",或者放弃split并使用不同的方法来计算单词.

逐行处理而不是一次读取整个文件也是一个很好的改进,但它并不像前两个项目那么重要.