【问题标题】:Why is my program using Perl's getc function not working properly?为什么我的程序使用 Perl 的 getc 函数不能正常工作?
【发布时间】:2011-10-16 09:48:52
【问题描述】:

我想使用 Perl 计算消息中字符出现的频率。例如,如果字符“a”在一条消息中出现 10 次,那么频率将为 10。为此,我使用 getc 函数一次从 FILE 中读取一个字符的消息。这是我写的sn-p。这是非常基本的,我知道。但是当我编译时,我得到一个错误:

详情:

#!/usr/bin/perl

use strict;
use warnings;

my $input=$ARGV[0];

open(INPUT,"<$input");

while(<INPUT>
{
 my $c=getc(INPUT);
 print $c."\n";
}

close(INPUT);

当我尝试编译时出现以下错误:

Use of uninitialized value in print at AccessChar.pl line 13, &lt;INPUT&gt; line 1.

我无法弄清楚,这个脚本有什么问题。有人可以帮我解决这个问题吗?

我什至尝试过使用getc INPUT 而不是getc(INPUT)。我认为在运行此脚本时不需要包含任何其他包。

【问题讨论】:

  • 您在该 sn-p 中出现语法错误(在 while 行中)。
  • getc 不工作......哦,是的。

标签: perl getc


【解决方案1】:
while (<INPUT>)

将在循环的每次迭代中从INPUT 读取整行。如果您想处理该文件一次处理一个字符,那么它不适合使用。

尝试类似:

my $c;
while (defined($c = getc(INPUT))) {
  print $c, "\n";
}

【讨论】:

  • 谢谢!它有效:) 我喜欢你的想法。由于 getc 在 Error 或 EOF 上返回 undef 值,我们可以使用定义函数。有趣!
【解决方案2】:

将文件读取运算符 (&lt; ... &gt;) 与 getc 混合使用是个坏主意。它没有做你认为的那样。

尝试将一些调试输出放入程序中,看看发生了什么。我通过自己运行程序来测试程序 (./getc getc)。

while 循环开始时,&lt;INPUT&gt; 从您的文件中读取一行并将其存储在$_ 中。然后使用getc 从文件中读取下一个字符。这将是文件第二行的第一个字符(可能是换行符 - 这很可能是该行上的唯一字符)。

下一次循环时,&lt;INPUT&gt; 读取下一行输入。那是use strict 行。 getcuse warnings 读取下一个字符,即“u”。

所以它一直持续到文件的末尾。 &lt;INPUT&gt; 读取一行,然后getc 从下一行读取第一个字符。

这根本不是你想要的。如果您想一次读取一个字符,那么您只需要getc

#!/usr/bin/perl

use strict;
use warnings;

my $input = shift;

open(my $file, '<', $input);

while (defined(my $c = getc $file)) {
  print "$c\n";
}

另一种选择是只使用&lt; ... &gt; 并在阅读时拆分每一行。

#!/usr/bin/perl

use strict;
use warnings;

my $input = shift;

open(my $file, '<', $input);

while (<$file>) {
  foreach my $c (split //) {
    print "$c\n";
  }
}

但是将这两种方法混合起来是行不通的。

【讨论】:

    【解决方案3】:

    只是为了一点 TIMTOWTDI:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    use Data::Dumper;
    
    local $/;
    my %chars;
    
    $chars{$_}++ for split //, <>;
    
    print Dumper \%chars;
    

    只要文件不是太大而不能啜饮,它就可以工作;如果是读取并拆分每一行。用法:

    $ count_chars.pl file_to_read
    

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多