【问题标题】:Difference between %hash and \%hash as a parameter?%hash 和 \%hash 作为参数的区别?
【发布时间】:2011-01-20 04:01:51
【问题描述】:

我目前正在尝试学习 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 上搜索什么。谢谢。

【问题讨论】:

  • 输入“perldoc perlreftut”,喝杯咖啡,尽情享受吧。

标签: perl syntax


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 2011-05-16
    • 2015-10-31
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2012-12-21
    • 2021-04-06
    相关资源
    最近更新 更多