【问题标题】:How can I count the characters in STDIN using perl without wc?如何在没有 wc 的情况下使用 perl 计算 STDIN 中的字符?
【发布时间】:2014-05-11 12:14:22
【问题描述】:

我正在尝试编写一个脚本来计算用户在 STDIN 中输入的行数、单词数和字符数。使用下面的脚本,当用户将文件作为 CLI 输入时,我可以完成此操作,但是当我尝试将此代码用于 STDIN 时,我最终会出现无限循环。我应该改变什么来解决这个问题?

print "Enter a string to be counted";
my $userInput = <STDIN>;
while ($userInput) {
        $lines++;
        $chars += length ($_);
        $words += scalar(split(/\s+/, $_));
}
printf ("%5d %5d %5d %10s", $lines, $words, $chars, $fileName);

【问题讨论】:

    标签: perl loops count wc


    【解决方案1】:

    您的程序很好,预计您需要从while 测试中的文件句柄读取。目前您只是从 STDIN 读取一行并反复检查它是否为 true - 即不为零或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 $_,因为$_length 运算符的默认参数。 $_ 只有在您使用默认值时才会真正发挥作用。

    同样,split 的默认参数是split ' ', $_,这是您想要的,而不是split /\s+/, $_,因为如果$_ 中有任何前导空格,后者会返回一个零长度的初始字段。单个文字空间 ' ' 的特殊值只是提取所有非空格字符序列,这几乎总是你想要的。除了一个空格之外的任何内容都会像往常一样转换为正则表达式模式。

    最后,我使用了++$lines 而不是$lines++。后者之所以流行只是因为语言 C++ 的名称,而且表达式返回的值需要是变量的 original 值而不是 new 一。更多情况下,增量本身用作语句,就像这里一样,当返回的值无关紧要时。如果 Perl 没有优化它(因为上下文是 void 并且返回值未使用),代码将做不必要的额外工作来保存变量的原始值,以便在递增后返回它。我还认为++$var 看起来更像是命令式"increment $var" 并且提高了代码的可读性。

    【讨论】:

    • 换行符应该算作字符吗?我想任何一种方式都可能是正确的。
    • @JohnC:我刚刚将它编码为与 Craig 的原始程序相同。只有他知道哪个是对的
    【解决方案2】:

    您的输入必须在循环内。否则,您将一遍又一遍地处理相同的字符串。

    【讨论】:

    • 将你的话添加到@JohnC 的程序中,你会得到比它的部分更重要的东西 :)
    【解决方案3】:

    也许这就是你需要的?

    use strict;
    use warnings;
    
    print "Enter a string to be counted:\n";
    my $lines = 0;
    my $chars = 0;
    my $words = 0;
    while (<>) {
        chomp;
        $lines++;
        $chars += length ($_);
        $words += scalar(split(/\s+/, $_));
    }
    printf ("lines: %5d words: %5d chars: %5d\n", $lines, $words, $chars);
    

    【讨论】:

    • 我认为你的程序会通过一些小故事得到很大帮助
    猜你喜欢
    • 2016-01-10
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多