這可能是一個簡單的問題,但我無法弄清楚。我有一個從例程返回,當我用數據::自卸車打印的結構,看起來像我試圖從Perl哈希中獲取數據的方式有什麼問題?
$VAR1 = {
'date' => 'May 15, 2012',
'value' => '0.20'
};
但我不能得到的數據出來。如果我嘗試$data{value}
,我什麼也得不到。我不熟悉Perl。誰能幫我?我錯過了什麼?
這可能是一個簡單的問題,但我無法弄清楚。我有一個從例程返回,當我用數據::自卸車打印的結構,看起來像我試圖從Perl哈希中獲取數據的方式有什麼問題?
$VAR1 = {
'date' => 'May 15, 2012',
'value' => '0.20'
};
但我不能得到的數據出來。如果我嘗試$data{value}
,我什麼也得不到。我不熟悉Perl。誰能幫我?我錯過了什麼?
你$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
,他們是不同的變量—但這是額外的混亂。)
這取決於你的子程序是如何寫入的。我猜想,它返回一個參考到哈希,在這種情況下,你的代碼應該是這個樣子:
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是對匿名散列的引用。
你缺少的是'use strict;使用警告;'。始終使用它! – ikegami 2012-07-11 18:45:42