如何在perl中打印哈希?

时间:2012-11-02 19:55:06

标签: string perl hash dereference

如何打印$ stopwords?它似乎是一个字符串($),但是当我打印它时,我得到:“HASH(0x8B694)”,每次运行时内存地址都会改变。

我正在使用Lingua :: StopWords,我只是想打印它正在使用的停用词,所以我肯定知道那里有什么停用词。我想打印这两个文件。

我是否需要尊重$ stopwords?

以下是代码:

use Lingua::StopWords qw( getStopWords );

open(TEST, ">results_stopwords.txt") or die("Unable to open requested file.");
my $stopwords = getStopWords('en');

print $stopwords;

我试过了:

my @temp = $stopwords;
print "@temp";

但这不起作用。救命啊!

最后注意:我知道有一个关于Lingua :: StopWords的停用词列表,但是我使用的是(en),我只想绝对确定我正在使用的停止词,所以这就是我想要的原因打印它,理想情况下我想将它打印到文件部分我应该已经知道如何做的文件。

4 个答案:

答案 0 :(得分:7)

$不代表字符串。它表示标量,可以是字符串,数字或引用。

$stopwords是哈希引用。要将其用作哈希,您可以使用%$stopwords

使用Data::Dumper作为打印哈希内容的快捷方式(通过引用传递):

use Data::Dumper;
...
print Dumper($stopwords);

答案 1 :(得分:3)

取消引用hashref:

%hash = %{$hashref};  # makes a copy

所以迭代键值

while(($key,$value)=each%{$hashref}){
    print "$key => $value\n";
}

或(效率低但教学目的)

for $key (keys %{$hashref}){
    print "$key => $hashref->{$key}\n";
}

答案 2 :(得分:2)

看看Data::Printer是Data :: Dumper的一个很好的替代品。它将为您提供漂亮的打印输出以及对象提供的方法的信息(如果您正在打印对象)。所以,每当你不知道自己得到了什么时:

use Data::Printer;
p( $some_thing );

你会惊讶于它有多么方便。

答案 3 :(得分:1)

getStopWords返回哈希 ref - 对哈希的引用 - 因此您可以通过预先%取消引用它。而你实际上只想要它的键,而不是它的值(都是1),因此你可以使用keys函数。例如:

print "$_\n" foreach keys %$stopwords;

print join(' ', keys %$stopwords), "\n";

你也可以跳过临时变量$stopwords,但是你需要将getStopWords调用包装在花括号{...}中,这样Perl就可以知道发生了什么:

print join(' ', keys %{getStopWords('en')}), "\n";