这可能是一个简单的问题,但我无法弄清楚。我有一个从例程返回的结构,当我使用 Data::Dumper 打印时,它看起来像
$VAR1 = {
'date' => 'May 15, 2012',
'value' => '0.20'
};
但我无法从中获取数据。如果我尝试$data{value}
,我什么也得不到。我对 Perl 不是很熟悉。谁能帮我?我错过了什么?
这可能是一个简单的问题,但我无法弄清楚。我有一个从例程返回的结构,当我使用 Data::Dumper 打印时,它看起来像
$VAR1 = {
'date' => 'May 15, 2012',
'value' => '0.20'
};
但我无法从中获取数据。如果我尝试$data{value}
,我什么也得不到。我对 Perl 不是很熟悉。谁能帮我?我错过了什么?
你$VAR1
是一个哈希引用,而不仅仅是一个哈希。因此,您需要取消引用变量以获取数据:
$VAR1->{date}
$VAR1->{value}
这是 Perl,所以 TMTOWTDI(有不止一种方法可以做到):
$$VAR1{date}
$$VAR1{value}
但是,显式->
箭头运算符通常更容易理解;左边的操作数是一个引用,右边的位访问它($hash->[0]
对于数组引用;$hash->{item}
对于哈希引用)。
您可以改用:
my %VAR2 = ('date' => 'May 15, 2012', 'value' => '0.20');
现在你可以写:
$VAR2{date}
$VAR2{value}
(我可以同时使用%VAR1
和$VAR1
;它们是不同的变量——但这更加令人困惑。)
这取决于您的子程序是如何编写的。我猜它正在返回对哈希的引用,在这种情况下,您的代码应该如下所示:
my $data = my_subroutine();
print $data->{value}, "\n";
问题是您不尊重变量的类型。Perl 支持用%
sigil 表示的散列,以及使用$
. 第二个是标量,必须取消引用才能获取数据。使用 perl 的调试器:
DB<1> $VAR1 = { 'date' => 'May 15, 2012', 'value' => '0.20' };
DB<2> x $VAR1->{'date'}
0 'May 15, 2012'
DB<3> x $VAR1->{'value'}
0 0.20
#!/bin/perl
$VAR1 = { 'date' => 'May 15, 2012', 'value' => '0.20' };
$date = $$VAR1{date};
$value = $$VAR1{value};
print "$date\n";
print "$value\n"
打印出来:
May 15, 2012
0.20
原因是 $VAR1 是对匿名哈希的引用。