Hash Perl子程序

Hash Perl子程序,hash,subroutine,perl,Hash,Subroutine,Perl,在这里,我修正了我的大部分错误,谢谢大家,在这一点上,请用我的哈希表提供任何其他建议,我如何清除每个单词,并将单词及其频率放入哈希表中,不包括空单词。。我想我的代码从现在开始就可以了。所以你可以关注算法的关键部分,如何接受STDIN上的输入并输出到STDOUT。这样就不需要进行参数检查等。只需一个简单的: $ prog < words.txt $prog

在这里,我修正了我的大部分错误,谢谢大家,在这一点上,请用我的哈希表提供任何其他建议,我如何清除每个单词,并将单词及其频率放入哈希表中,不包括空单词。。我想我的代码从现在开始就可以了。

所以你可以关注算法的关键部分,如何接受STDIN上的输入并输出到STDOUT。这样就不需要进行参数检查等。只需一个简单的:

$ prog < words.txt
$prog
您真正需要的是一个非常简单的算法:

  • 读一行
  • 把它分成几个字
  • 记下字数
  • 完成后,显示计数
这是一个示例程序

#! /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";
}
#/usr/bin/perl-w
严格使用;
我的数据%;
而(){
咀嚼;
我的(@words)=拆分(/\s+/);
foreach我的$word(@words){
如果(!已定义($data{$word})){
$data{$word}=0;
}
$data{$word}++;
}
}
foreach(排序(键(%数据))){
打印“$\:$data{$\}\n”;
}
一旦您了解了这一点并使其在您的环境中工作,您就可以扩展它以满足其他需求:

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

我同意从dave的答案开始会更有成效,但如果你对自己的错误感兴趣,以下是我看到的:

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

  • 您可以在不读取文件的情况下立即打开和关闭文件。没有道理

  • 声明

    而()

  • 从标准输出或命令行参数中的所有文件读取。后一个变量与您想要的类似,但第二个参数是输出文件,而不是输入。钻石操作员也会尝试从中读取数据。您有两个选项:a)在命令行参数中仅使用一个文件名,使用读取文件,使用标准输出进行输出,并将输出重定向到shell中的文件;b) 使用


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

    您自己做了哪些测试/调试?我知道你在Perl中是新的,但是在任何语言中,代码<>返回 ING在循环中间做你想要的。更具体地说,我完全不知道如何从输入文件中创建单词列表,并将空格和破折号作为分隔符。潜艇只需返回列表。对于我的散列,我希望它把单词和频率放在一个散列中。谢谢大家的回答,你打开了文件;你关闭文件;然后使用
    while()
    来处理参数,这意味着Perl同时读取输入文件和现在创建但为空的输出文件。你的
    createList
    在第一个单词上返回-这似乎是错的。@KeithThompson:什么@Borodin:问题原始版本中的代码有过多的空行(请检查编辑历史记录)。在你发表评论之前,它已被修复。我将删除我的原始注释。到目前为止,我已经修复了大部分代码。非常感谢您的反馈,谢谢。
    while(<$file1>)
    
    return $str, $hash{$str};