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

Perl 如何将数组更改为哈希表?,perl,hashmap,Perl,Hashmap,我正试图制作一个程序,在这个程序中,我在一个文件中读取一堆文本。然后我取出标点符号,然后读入一个文件,里面有停止词。两者都被读入并放入数组中。我试图将常规文本文件的数组放入一个散列中。我不确定我做错了什么,但我正在努力。我想这样做,这样我就可以生成关于有多少单词被重复和什么没有重复的统计数据,但我必须去掉停止词等等 不管怎么说,这就是我到目前为止所做的事情,我在这里发表了一条评论,致力于将数组合并到散列中,这就是我的工作所在。我不认为我试图将数组放入哈希的方式是正确的,但我在网上查看了%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;
#/usr/bin/perl
严格使用;
使用警告;
#在文本文件中读取
my$file0=“data.txt”;

打开(my$filehandle0,“好吧,如果你在
@words
数组中有一个单词列表,并且想要得到一个哈希,其中每个关键字都指向特定的单词,每个值都是这个单词在源数组中出现的数量,那么就简单到

my %words_count;
$words_count{$_}++ for @words;
换句话说(没有双关语),您迭代
@words
数组,每个成员将
%words\u count
散列的对应元素增加1,或者,当该元素尚未定义时,基本上使用值1创建它(所谓)


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

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

无论如何,这是我到目前为止所做的,我在这里放了一条注释#正在将数组合并到哈希中,这就是我正在做的。我不认为我试图将数组放入哈希中的方式是正确的,但是我在网上看了看,并且%HASH{ARRAY}=“value”没有编译。所以不确定如何做

首先,问问自己为什么要“将数组放入散列”。数组表示一组值,而散列表示一组键值对。因此,您必须定义哪些键和值应该是。不仅对我们,而且对您。这通常有助于

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

$count{foo}++;
上面(
%hash{array}=“value”
)的“联机查看”结果没有意义。有三种有效的方法可以将值存储在哈希中:

设置所有键值对方法是将一个大小相等的列表分配给整个哈希:

%count = (hello => 42, world => 17);
通过为已定义的键指定单个值,为给定键设置单个值(这是我们以前所做的):

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

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

注意这里使用的符号:
%
用于混合键和值的散列大小相等的列表,
$
用于单个(标量)值,
@
用于值列表。在您的示例中,您使用的是
%
,但在键括号
{…}
中定义一个数组并分配一个标量值。

$words\u count++对于@words;不会导致编译错误?@KirsKringle你认为它为什么会导致编译错误?好的,我在另一个例子中看到了使用的键。我以前从未使用过perl,而且我的编程生涯还很早。我感谢你的帮助。@memowe早些时候我在网上发现了一些我厌倦了这样做的++的东西,它给了我一个编译错误。我想尝试一下。@KirsKringle我试图解释一些关于Perl哈希的事实,以及如何在我的回答中使用它们来澄清一些事情。提示:看看这些符号!我想我需要更多地了解这个标量。它和我想的大不相同。橡皮鸭是一个很棒的提示。哦,这里没有火箭科学。标量值是just单个原子值,如数字或字符串。但您可能想了解有关Perl基本类型(标量、数组、哈希)及其符号的更多信息:
$count{hello} = 42;
@count{qw(hello world)} = (42, 17);