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

标签 perl syntax

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

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

现在,在Perl中搜索“print_r”(PHP)等效项并看到人们推荐Data::Dumper,直到我看到一个使用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);输出以下内容:
$VAR1 = {
          'key2' => 'value2',
          'key1' => 'value1'
        };

有人可以确切解释这是什么以及正在发生什么吗?我在Perl书中找不到此书,甚至不知道在Google上搜索什么。谢谢。

最佳答案

借用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

关于perl - %hash和\%hash作为参数之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730954/

相关文章:

.net - 让日志阅读更高效

javascript - jQuery 喜欢内联语法而不使用 jQuery?

C# 语法 - 变量名后的冒号

CSS:分组属性

arrays - 使用范围运算符分配给 3D 数组的切片

perl - 如果 perl 是按引用调用,为什么会发生这种情况?

javascript - 用空格混淆变量名

c++ - 尾随返回类型函数语法中的 auto 关键字背后是否有意图?

perl - 如果传入未定义的值,则使用 Params::Validate 设置默认值

c - Perl 无法定位内联 C 模块 : "Had problems bootstrapping Inline module"