如何将数组更改为哈希表?

时间:2012-11-18 23:21:56

标签: perl hashmap

我正在尝试创建一个程序,我在其中读取一个包含大量文本的文件。然后我拿出标点符号,然后我读了一个文件,里面有停用词。两者都被读入并放入数组中。我正在尝试将一般文本文件的数组放入哈希值。我不确定我做错了什么,但我正在努力。我想这样做,所以我可以生成有关重复多少单词和不重复多少单词的统计数据,但我必须取消停止单词等。

无论如何,这是我到目前为止我发表评论#WORKING ON MERGING ARRAY IN HASH,这是我工作的地方。我不认为我试图将数组放入哈希的方式是正确的,但我在网上查看了%hash {array} =“value”;不编译。所以不知道怎么做。

谢谢,如果您对我有任何疑问,我会尽快回复。

#!/usr/bin/perl
use strict;
use warnings;

#Reading in the text file
my $file0="data.txt";
open(my $filehandle0,'<', $file0) || die "Could not open $file0\n";
my@words;
while (my $line = <$filehandle0>){
    chomp $line;
    my @word = split(/\s+/, $line); 
    push(@words, @word);
}
for (@words) {
    s/[\,|\.|\!|\?|\:|\;]//g;
}
my %words_count;  #The code I was told to add in this post. 
    $words_count{$_}++ for @words;

接下来,我读到了另一个数组中的停用词。

#Reading in the stopwords file
my $file1 = "stoplist.txt"; 
open(my $filehandle1, '<',$file1) or die "Could not open $file1\n";
my @stopwords;
while(my $line = <$filehandle1>){
    chomp $line;
    my @linearray = split(" ", $line);
    push(@stopwords, @linearray);
}
for my $w (my @stopwords) {
    s/\b\Q$w\E\B//ig; 
}

2 个答案:

答案 0 :(得分:7)

关于Perl中哈希的一些注释......问题描述:

  

无论如何,这是我到目前为止我发表评论#WORKING ON MERGING ARRAY IN HASH,这是我工作的地方。我不认为我试图将数组放入哈希的方式是正确的,但我在网上查看了%hash {array} =“value”;不编译。所以不知道怎么做。

首先,问问自己为什么你想“将数组放入哈希”。数组表示值列表,而哈希表示一组键值对。所以你必须定义键和值应该是什么。不仅对我们而言,对你而言。它通常有助于explain even simple things to get a better understanding

在这种情况下,您可能需要计算$word数组中给定单词@words的出现频率。这可以通过迭代所有单词并每次增加$count{$word}来完成。这就是@ raina77ow在他的回答中所做的。这里重要的是,您正在访问单个哈希值,这些哈希值用Perl中的标量符号$表示。因此,如果您有一个名为%count的哈希值,则可以通过

增加键'foo'的值
$count{foo}++;

上面的“在线观看”结果(%hash{array} = "value")没有意义。有三种有效的方法可以在散列中存储值:

通过为整个哈希值分配一个偶数大小的列表来设置所有键值对

%count = (hello => 42, world => 17);

为给定键设置单个值,为已定义的键分配单个值(这是我们之前所做的):

$count{hello} = 42;

使用所谓的哈希切片为给定的键列表设置值列表

@count{qw(hello world)} = (42, 17);

请注意这里使用的符号:%表示混合密钥和值的hashy偶数列表,$表示单个(标量)值,@表示值列表。在您的示例中,您使用的是%,但在大括号{...}中定义了一个数组,并指定了一个标量值。

答案 1 :(得分:4)

好吧,如果你在@words数组中有一个单词列表,并希望得到一个散列,其中每个键引用特定单词,并且每个值是源数组中这个单词出现的数量,它是完成就像......一样简单。

my %words_count;
$words_count{$_}++ for @words;

换句话说(没有双关语),你迭代@words数组,每个成员增加1 %words_count哈希OR的对应元素,当该元素尚未定义时,基本上创建它的值为1(所谓的auto-vivification)。

作为旁注,在数组上调用keys函数几乎没有意义:在5.12 +中,它将为您提供使用的索引列表,在此之前,抛出语法你错了。