%hash和\%hash之间的区别作为参数?

时间:2011-01-19 01:40:42

标签: perl syntax

我目前正在尝试学习Perl,我注意到有时人们在将它们作为参数传递时会“逃避”变量。我首先注意到这是使用SQL :: Abstract:

my %hash = (
  'foo' => 'bar'
);
$db->insert('table', \%hash);

现在,在Perl中搜索“print_r”(PHP)等价物并看到人们推荐Data :: Dumper,我无法理解为什么在我看到使用{{1}的示例之前人们会认为它们是等效的而不是print Dumper(\%hash);

这样:

print Dumper(%hash);

输出:

my %hash = (
  key1 => 'value1',
  key2 => 'value2'
);
print Dumper(%hash);

但是$VAR1 = 'key2'; $VAR2 = 'value2'; $VAR3 = 'key1'; $VAR4 = 'value1'; 输出了这个: print Dumper(\%hash);

有人可以准确解释这是什么以及发生了什么?我在我的Perl书上找不到这个,甚至不知道在Google上搜索什么。感谢。

1 个答案:

答案 0 :(得分:17)

借用Ether的评论 - 查看语言规范中的Perl References Tutorial以及稍后的Perl References Manual。或者在命令行中使用perldoc perlreftutperldoc perlref


当您传递%hash时,Perl会将大量元素传递给被调用函数,这些元素对应于键/值对。

当您传递\%hash时,Perl会传递对哈希的引用 - 实质上是哈希的地址。

例如:

my %hash = ( Key1 => "Value1", Key2 => "Value2" );
sub counter
{
    printf "Count: %d\n", scalar(@_);
}
counter(%hash);
counter(\%hash);

生成:

Count: 4
Count: 1

您可以通过多种方式获取数据:

sub hashref
{
    my($ref) = @_;
    foreach my $key (keys %{$ref})
    {
         print "$key: $ref->{$key}\n";
    }
}

sub hashnonref
{
    my(%hash) = @_;
    foreach my $key (keys %hash)
    {
        print "$key: $hash{$key}\n";
    }
}

sub hashasarray
{
    my(@array) = @_;
    foreach my $value (@array)
    {
         print "Value: $value\n";
    }
}

hashref(\%hash);   # Same data as before
print "\n";
hashnonref(%hash);
hashasarray(%hash);

额外输出:

Key2: Value2
Key1: Value1

Key1: Value1
Key2: Value2
Value: Key2
Value: Value2
Value: Key1
Value: Value1