在这里我修复了大部分错误,谢谢大家,其他任何建议请用我的哈希点,我怎样才能清除每个单词并将单词及其频率放在哈希中,排除空单词...从现在开始想我的代码。
答案 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)
我同意从戴夫的回答开始会更有成效,但如果你对自己的错误感兴趣,我会看到以下内容:
将checkArgs的返回值赋给标量变量$ checkArgs,但返回一个数组值。这意味着$ checkArgs在此调用之后将始终包含2(数组的大小)(因为如果参数的数量不是2,程序将会死亡)。这不是很糟糕,因为您以后不使用该值,但在这种情况下为什么需要它?
您打开文件并立即关闭它们而不从中读取它们。没有意义。
声明
while(&lt;&gt;)
从标准输出或命令行参数中的所有文件中读取。后一种变体就像你想要的那样,但你的第二个参数是输出文件,而不是输入。钻石运营商也会尝试从中读取。您有两个选择:a)在命令行参数中只使用一个文件名,使用&lt;&gt;读取文件,使用标准输出进行输出,并将输出重定向到shell中的文件; b)使用
while(<$file1>)
当然,在关闭文件之前,。选项a)是传统的Unix和Perl风格,但b)为初学者提供了更清晰的代码。
言
返回$ word;
和
return $str, $hash{$str};
在循环的第一次迭代中返回相应的值,所有其他数据仍未处理。在第一种情况下,您应该创建一个本地数组,在其中存储所有$ word并返回整个数组。在第二种情况下,您已经有了这样的本地%哈希,它足以返回此哈希。在这两种情况下,您都需要将函数的返回值分配给标量,而不是相应地分配给数组和散列。现在,你实际上丢失了所有数据。