2012-07-11 68 views
1

這可能是一個簡單的問題,但我無法弄清楚。我有一個從例程返回,當我用數據::自卸車打印的結構,看起來像我試圖從Perl哈希中獲取數據的方式有什麼問題?

$VAR1 = { 
    'date' => 'May 15, 2012', 
    'value' => '0.20' 
}; 

但我不能得到的數據出來。如果我嘗試$data{value},我什麼也得不到。我不熟悉Perl。誰能幫我?我錯過了什麼?

+2

你缺少的是'use strict;使用警告;'。始終使用它! – ikegami 2012-07-11 18:45:42

回答

6

$VAR1是哈希參考,不只是一個哈希值。所以,你需要取消引用變量來獲得數據:

$VAR1->{date} 
$VAR1->{value} 

這是Perl的,所以TMTOWTDI(有一個以上的方式做它):

$$VAR1{date} 
$$VAR1{value} 

然而,明確->箭頭運營商通常更容易理解;左側的操作數是一個引用,右側的位訪問它(對於數組ref,爲$hash->[0];對於散列ref,$hash->{item})。

你也可以使用:

my %VAR2 = ('date' => 'May 15, 2012', 'value' => '0.20'); 

現在你可以這樣寫:

$VAR2{date} 
$VAR2{value} 

(我可以用兩個%VAR1$VAR1,他們是不同的變量—但這是額外的混亂。)

1

這取決於你的子程序是如何寫入的。我猜想,它返回一個參考到哈希,在這種情況下,你的代碼應該是這個樣子:

my $data = my_subroutine(); 
print $data->{value}, "\n"; 
0

的問題是你是不是紀念變量的類型。 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 
0
#!/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是對匿名散列的引用。