Perl子程序

时间:2016-07-21 01:34:37

标签: perl hash subroutine perl5

在这里我修复了大部分错误,谢谢大家,其他任何建议请用我的哈希点,我怎样才能清除每个单词并将单词及其频率放在哈希中,排除空单词...从现在开始想我的代码。

2 个答案:

答案 0 :(得分:3)

因此,您可以专注于算法的关键部分,如何接受STDIN上的输入并输出到STDOUT。这样就没有参数检查等等。只是一个简单的:

$ prog < words.txt

您真正需要的只是一个非常简单的算法:

  • 阅读一行
  • 将其拆分为单词
  • 记录单词的计数
  • 完成后,显示计数

这是一个示例程序

#! /usr/bin/perl -w    
use strict;

my (%data);
while (<STDIN>) {
    chomp;
    my(@words) = split(/\s+/);
    foreach my $word (@words) {
        if (!defined($data{$word})) {
            $data{$word} = 0;
        }
        $data{$word}++;
    }
}

foreach (sort(keys(%data))) {
    print "$_: $data{$_}\n";
}

一旦理解了这一点并让它在您的环境中运行,您可以扩展它以满足您的其他要求:

  • 从每个单词中删除非字母字符
  • 每行打印三个结果
  • 使用输入和输出文件
  • 将算法放入子程序

答案 1 :(得分:0)

我同意从戴夫的回答开始会更有成效,但如果你对自己的错误感兴趣,我会看到以下内容:

  1. 将checkArgs的返回值赋给标量变量$ checkArgs,但返回一个数组值。这意味着$ checkArgs在此调用之后将始终包含2(数组的大小)(因为如果参数的数量不是2,程序将会死亡)。这不是很糟糕,因为您以后不使用该值,但在这种情况下为什么需要它?

  2. 您打开文件并立即关闭它们而不从中读取它们。没有意义。

  3. 声明

    while(&lt;&gt;)

  4. 从标准输出或命令行参数中的所有文件中读取。后一种变体就像你想要的那样,但你的第二个参数是输出文件,而不是输入。钻石运营商也会尝试从中读取。您有两个选择:a)在命令行参数中只使用一个文件名,使用&lt;&gt;读取文件,使用标准输出进行输出,并将输出重定向到shell中的文件; b)使用

    while(<$file1>)
    
    当然,在关闭文件之前,

    。选项a)是传统的Unix和Perl风格,但b)为初学者提供了更清晰的代码。

    1. 返回$ word;

    2. return $str, $hash{$str};
      

      在循环的第一次迭代中返回相应的值,所有其他数据仍未处理。在第一种情况下,您应该创建一个本地数组,在其中存储所有$ word并返回整个数组。在第二种情况下,您已经有了这样的本地%哈希,它足以返回此哈希。在这两种情况下,您都需要将函数的返回值分配给标量,而不是相应地分配给数组和散列。现在,你实际上丢失了所有数据。