0

別のスレッドでは、特定のキーにアクセスする方法の具体例が示されています。とにかく、任意のキーにアクセスできるサブをコーディングするときに知られているベストプラクティスはありますか? たとえばsub get_lat、具体的な属性である緯度です。ただし、 などのより一般的なオプションに注目してくださいsub get_value_by_keys($$$)&get_value_by_keys(bounds,northeast,lat)戻り51.4770228ます。

  address_components => [
    {
      long_name => "Blackheath Avenue",
      short_name => "Blackheath Ave",
      types => ["route"],
    },
    {
      long_name => "Greater London",
      short_name => "Gt Lon",
      types => ["administrative_area_level_2", "political"],
    },
    {
      long_name => "United Kingdom",
      short_name => "GB",
      types => ["country", "political"],
    },
    {
      long_name => "SE10 8XJ",
      short_name => "SE10 8XJ",
      types => ["postal_code"],
    },
    {
      long_name => "London", short_name => "London", types => ["postal_town"]
    },
  ],

  formatted_address => "Blackheath Avenue, London SE10 8XJ, UK",   
  geometry => {
    bounds        => {
      northeast => { lat => 51.4770228, lng => 0.0005404 },
      southwest => { lat => 51.4762273, lng => -0.0001147 },
    },
    location      => { lat => 51.4766277, lng => 0.0002212 },
    location_type => "APPROXIMATE",
    viewport      => {
      northeast => { lat => 51.4779740302915, lng => 0.00156183029150203 },
      southwest => { lat => 51.4752760697085, lng => -0.00113613029150203 },
    },
  },

  types => ["route"],

}

この問題を解決する方法と、そのような構造に対処する方法のヒントはありますか?

4

2 に答える 2

3

データ構造の任意のレベルに降りるには、一番上から始めます。変数を使用して現在のレベルへの参照を保持し、次のレベルが見つかるたびに更新します。最後までやり遂げた場合、それはあなたが望んでいた値です:

sub get_value_by_keys {
    my( $current_level, @keys ) = @_;

    foreach my $key ( @keys ) {
        if( eval{ exists $current_level->{$key} } ) {
            print "$key key exists\n";
            $current_level = $current_level->{$key}; # the trick
            }
        else { return }
        }

    return $current_level;
    }

次に、必要なデータ構造とキーを使用して呼び出します。

get_value_by_keys( $data, qw( geometry bounds northeast lat) );

プロトタイプはまったく必要ありません。

于 2013-10-30T21:45:43.290 に答える
0

必要なことを行う CPAN モジュールがいくつかあります。例Data::Diver:

use Data::Diver qw(Dive);
print Dive($data, qw(geometry bounds northeast lat)), "\n";

このモジュールの利点は、データ構造内の配列参照も処理できることです。たとえば、2 番目の住所コンポーネントの long_name を取得するには、次のように使用します。

print Dive($data, qw(address_components 1 long_name)), "\n";

他のモジュールは XPath に似た構文 ( Data::DPath, ) を実装しています。ここでは、値にアクセスData::Pathするために文字列を使用します。"//geometry/bounds/northeast/lat"

于 2013-10-31T07:47:34.510 に答える