[英]How do I pass a variable as a method to a Perl hash reference?
首先,關於我所說的各種Perl語言構造,請在標題和正文中更正我的語言!
我在將變量傳遞給哈希引用時遇到麻煩。 具體來說,我正在使用JSON模塊解碼一些JSON數據,然后訪問該數據的特定部分。
這是我的JSON數據示例:
[
{
label:"Blah",
data:[
[ 2112, 1 ]
]
}
]
現在這是我的Perl代碼:
use JSON;
use Data::Dumper;
my $json = "*JSON data above*";
my $decoded_json = decode_json($json);
# This works, prints out '2112':
print( Dumper( $decoded_json->[0]{'data'}[0][0] ));
# What I'd like to do:
$datapath = "[0]{'data'}[0][0]";
print( Dumper( $decoded_json->$datapath ));
有沒有辦法做到這一點? 謝謝!
盡管可以使用eval進行此操作,但是該方法存在問題。
我懷疑這對於您的基本問題是一個更好的答案:
use Data::Diver;
my @datapath = ( 0, 'data', 0, 0 );
print( Dumper( Data::Diver::Dive($decoded_json, @datapath) ));
通常這是不可能的,但是有一些解決方法:
做一個字符串eval
:
my $val = do { local $@; my $val = eval "\\$decoded_json->$datapath"; die $@ if $@; $val; };
當然,以這種方式使用eval
是不受歡迎的。
定義一個遍歷數據結構的函數:
sub walk { my $data = shift; while (@_) { my $index = shift; if (ref $data eq 'HASH') { $data = $data->{$index}; } elsif (ref $data eq 'ARRAY') { $data = $data->[$index]; } else { die qq(Wanted to use index "$index", but "$data" is neither hash nor array); } } return $data; } my $val = walk($decoded_json, 0, 'data', 0, 0);
當然,這將因對象過載而失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.