2

我正在尝试制作一个程序,在其中读取包含一堆文本的文件。然后我取出标点符号,然后读入一个包含停用词的文件。两者都被读入并放入数组中。我正在尝试将通用文本文件的数组放入哈希中。我不确定我做错了什么,但我正在努力。我想这样做,这样我就可以生成关于重复多少单词和不重复单词的统计信息,但我必须去掉停用词等。

无论如何,到目前为止,我已经发表了评论#WORKING ON MERGING ARRAY INTO 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; 
}
4

2 回答 2

7

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

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

首先,问问自己为什么要“将数组放入散列”。数组表示值列表,而哈希表示一组键值对。所以你必须定义键和值应该是什么。不仅为我们,也为您。它通常有助于解释甚至简单的事情以更好地理解

在这种情况下,您可能想要计算给定单词$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);

请注意此处使用%sigils:用于混合的键和值的哈希偶数列表,$用于单个(标量)值和@值列表。在您的示例中,您使用的是%,但在键大括号中定义一个数组{...}并分配一个标量值。

于 2012-11-18T23:50:53.463 回答
4

好吧,如果您有一个数组中的单词列表@words,并且想要获得一个哈希,其中每个键都指向特定单词,并且每个值是该单词在源数组中出现的数量,那么它就像...

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

换句话说(没有双关语),您迭代@words数组,对于每个成员将哈希的相应元素增加 1,%words_count或者,当该元素尚未定义时,本质上是使用值 1 创建它(所谓的auto-vivification)。

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

于 2012-11-18T23:25:34.003 回答