0

$artifactData::Dumper を使用して印刷している Perl ハッシュ参照があります。

の出力は次をprint Dumper ($artifact);返します。

$VAR1 = bless( {
             '_content' => '{
  "results" : [ {
"uri" : "http://localhost:port/myfile.tar"
   } ]
}',);

しかし、URI の値に具体的にアクセスしようとすると問題が発生します。つまり、値があるかどうかを確認したいのですuri

ありがとう!

編集:ちょっとした文脈。Artifactory::Client perl モジュールの「artifact_search」メソッドを使用しています

4

3 に答える 3

6

ハッシュ参照から情報を抽出するには、まず逆参照する必要があります。次のいずれかを実行できます。

print ${$artifact}{uri},"\n"; 

この特定のケースでは、中かっこを省略して、次のようにすることができます。

print $$artifact{uri},"\n"; 

ただし、あいまいになる可能性があるため、表記のスタイルが逆参照に対して常に機能するとは限らないことに注意してください。

または、より新しく、おそらくより明確な表記 (たとえば、オブジェクト指向など)

print $artifact->{uri},"\n";

ただし、ここには大きな警告ベルがありblessます。これは、おそらくオブジェクトを操作していることを意味します。オブジェクトの内部を突くのは非常に汚いです。あなたはそれをするべきではありません。通常、オブジェクトには、必要な情報を提供するアクセサ メソッドが含まれます。慣例により、_接頭辞は、privateたとえば「これを台無しにしないでください」を示します。(とにかくそうすべきではない)

コメントにあるように、これはオブジェクトに埋め込まれた JSON テキスト文字列です。したがって、本当にこれを行うことに決めた場合は、JSON を解析して、それを perl データ構造に変換し、それを使用できます。

しかし、操作しているオブジェクトにはいくつかのアクセサ メソッドが組み込まれている可能性が高く、それらを使用する必要があります。

上記の例を考えると:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use JSON;

my $hashref = {
    _content => '{
      "results" : [ {
"uri" : "http://localhost:port/myfile.tar"
   } ]
}'
};

print Dumper \$hashref;

my $json    = JSON->new();
my $json_ob = $json->decode( $hashref->{_content} );
print Dumper \$json_ob;
print $json_ob ->{results}->[0]->{uri};

ただし、コメントで述べたように、使用している: Artifactory::Clientは非常に賢明に使用していますLWP

このモジュールで提供されるすべてのパブリック メソッドは、HTTP::Response オブジェクトを返します。

ドキュメントを参照すると、次のHTTP::Responseサンプルが得られます。

if ($artifact->is_success) {
    print $artifact->decoded_content;
}
else {
    print STDERR $artifact->status_line, "\n";
}
于 2015-02-02T13:37:59.887 に答える