2

まず第一に、私がさまざまな 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 ));

これを行う方法はありますか?ありがとう!

4

2 に答える 2

3

eval を使用してそれを行うことは可能ですが、そのアプローチには問題があります。

これがあなたの根本的な問題に対するより良い答えだと思います:

use Data::Diver;
my @datapath = ( 0, 'data', 0, 0 );
print( Dumper( Data::Diver::Dive($decoded_json, @datapath) ));
于 2013-07-08T15:30:09.970 に答える
2

これは通常は不可能ですが、回避策があります。

  1. 文字列を実行しますeval-:

    my $val = do {
      local $@;
      my $val = eval "\$decoded_json->$datapath";
      die $@ if $@;
      $val;
    };
    

    もちろん、evalこのような使い方は嫌われます。

  2. データ構造をたどる関数を定義します。

    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);
    

    もちろん、これはオーバーロードされたオブジェクトでは失敗します。

于 2013-07-08T15:30:56.203 に答える