0

简单的问题:

我如何在一行上做到这一点:

my $foo = $bar->{baz};
fizz(\$foo);

我已经尝试过 \$bar->{baz}、\${$bar->{baz}} 和许多其他的。这甚至可能吗?

-fREW

更新:好的,hashref 来自 DBI,我将标量 ref 传递到模板工具包中。我想现在我更仔细地观察这个问题与 TT 如何完成所有这些有关。实际上我想说:

$template->process(\$row->{body}, $data);

但是 TT 不是这样工作的,TT 需要一个标量 ref 并将数据放在那里,所以我必须这样做:

$template->process(\$row->{body}, $shopdata, \$row->{data});

无论如何,感谢您的帮助。我至少只有一个参考而不是两个。

4

4 回答 4

5
\$bar->{baz}

应该管用。

例如:

my $foo;
$foo->{bar} = 123;

my $bar = \$foo->{bar};

$$bar = 456;

print "$foo->{bar}\n";   # prints "456"

为了回答 OP 中的更新,您可以执行以下操作:

\@$row{qw(body data)};

这与 \@array 不同,后者会创建一个对数组的引用。以上将分发参考并列出两个参考。

于 2008-11-25T17:15:34.767 回答
4

\$bar->{baz} 似乎对我有用:

my $bar = { baz => 1 };
print $bar->{baz}, "\n";  # prints 1
my $ref =  \$bar->{baz};
print $$ref, "\n";        # prints 1
$$ref = 2;
print $bar->{baz}, "\n";  # prints 2 
于 2008-11-25T17:16:07.543 回答
2

你没有显示 %bar 和 fizz() 是如何设置的,所以我这样设置它们:

my %hash;
my $bar = \%hash;
$hash{baz} = "found it\n";
sub fizz {
  my $ref = shift;
  print $$ref;
}

然后,这两个工作,你的原件:

my $foo = $bar->{baz};
fizz(\$foo);

以及您说您尝试过的一种变体:

fizz(\$bar->{baz});

你能显示给你的错误吗?

于 2008-11-25T17:14:58.840 回答
0

我什至不确定你在做什么。您还应该在 baz 周围加上引号。

现在让我们考虑您为第一行中的标量分配了一个标量,那么第二行应该可以工作。但是我真的不知道这是否是您在这里尝试的,并且在 Perl 中并没有真正意义。使用引用通常在其他语言中用于

  1. 加快函数调用
  2. 允许返回多个值。

现在,标量通常不需要第一个,而且无论如何 Perl 是一种脚本语言,所以如果您真的关心速度,请编写 C。

Perl 中不需要第二个,因为您可以很容易地返回列表和对匿名哈希的引用。

你看过“man perlref”吗?

于 2008-11-25T17:10:47.413 回答