您的程序很好,期望您需要从测试中的文件句柄中读取while。目前,您只是从 STDIN 读取一行并反复检查它是否为真- 即不是零或undef.
您的代码应如下所示
use strict;
use warnings;
my ($lines, $chars, $words) = (0, 0, 0);
print "Enter a string to be counted";
while (<STDIN>) {
++$lines;
$chars += length;
$words += scalar split;
}
printf "%5d %5d %5d\n", $lines, $words, $chars;
请注意,我使用了只是length而不是length $_as$_是length运算符的默认参数。$_只有在您使用默认值时才会真正发挥作用。
同样,默认参数 tosplit是split ' ', $_您想要的,split /\s+/, $_因为如果 . 中有任何前导空格,后者将返回零长度初始字段$_。单个文字空间的特殊值' '只是提取所有非空格字符序列,这几乎总是你想要的。除了单个空格之外的任何内容都将正常转换为正则表达式模式。
最后,我使用++$lines了而不是$lines++. 后者之所以流行只是因为 C++ 语言的名称,而且表达式返回的值需要是变量的原始值而不是新值的情况不太常见。更多情况下,增量本身用作语句,就像这里一样,当返回的值无关紧要时。如果 Perl 没有优化它(因为上下文是 void 并且返回值未使用),代码将做不必要的额外工作来保存变量的原始值,以便在递增后返回它。我也认为++$var看起来更像是命令式的“增量$var”,并提高了代码的可读性。