6

Net :: Amazon :: EC2ライブラリで少し遊んでいますが、オブジェクトのプロパティを印刷する簡単な方法を見つけることができません。

これは機能します:

my $snaps = $ec2->describe_snapshots();
foreach my $snap ( @$snaps ) {
  print $snap->snapshot_id . " " .  $snap->volume_id . "\n";
}

しかし、私が試してみると:

 print "$snap->snapshot_id $snap->volume_id \n";

私は得る

Net::Amazon::EC2::Snapshot=HASH(0x4c1be90)->snapshot_id

印刷内にプロパティの値を印刷する簡単な方法はありますか?

4

7 に答える 7

11

$snap->volume_idプロパティではなく、メソッド呼び出しです。文字列内のメソッド呼び出しを補間することはできますが、それは非常に醜いです。

オブジェクトのすべてのプロパティを取得するにはData::Dumper、コアperlに含まれているモジュールを使用できます。

use Data::Dumper;
print Dumper($object);
于 2012-11-05T20:33:57.697 に答える
9

あなたがそれをしたい方法ではありません。実際、あなたがしている$snap->snapshot_idのは(のように)メソッドを呼び出すことですsub。Perlは、二重引用符で囲まれた文字列内ではそれを行うことができません。変数を補間します$snap。それがそれであるHASH(0x1234567)ため、それは次のようなものになります:blessハッシュのed参照。

補間はスカラー(および配列)でのみ機能しますが、それは省略します。行ってもいい:

print "$foo $bar"; # scalar
print "$hash->{key}"; # scalar inside a hashref
print "$hash->{key}->{moreKeys}->[0]"; # scalar in an array ref in a hashref...

ただし、これを行う方法は1つあります。ここで行うように、引用符で囲まれた文字列内で参照および逆参照できます。

use DateTime;
my $dt = DateTime->now();
print "${\$dt->epoch }"; # both these
print "@{[$dt->epoch]}"; # examples work

しかし、それはかなり醜いように見えるので、私はそれをお勧めしません。代わりに最初のアプローチを使用してください!

それがどのように機能するかにまだ興味がある場合は、これらのPerlFAQも参照することをお勧めします。


perlrefから:

サブルーチン呼び出しを文字列に補間するための秘訣は次のとおりです。

print "My sub returned @{[mysub(1,2,3)]} that time.\n";

それが機能する方法は、@ {...}が二重引用符で囲まれた文字列に表示されると、ブロックとして評価されるというものです。このブロックは、mysub(1,2,3)への呼び出しの結果を含む匿名配列への参照を作成します。したがって、ブロック全体が配列への参照を返します。配列は@ {...}によって逆参照され、二重引用符で囲まれた文字列に固定されます。このchicaneryは、任意の表現にも役立ちます。

print "That yields @{[$n + 5]} widgets\n";

同様に、スカラーへの参照を返す式は、${...}を介して逆参照できます。したがって、上記の式は次のように書くことができます。

print "That yields ${\($n + 5)} widgets\n";
于 2012-11-05T20:34:16.417 に答える
2

あなたが示した最初のサンプルに固執します。見た目もすっきりしていて読みやすいです。

于 2012-11-05T20:24:57.763 に答える
2

これを見つけるのに長い時間がかかり、他の人も恩恵を受けるかもしれないと感じているので、私はこれに答えています。

オブジェクトをより適切に印刷するには、Data :: Printerとp()を使用します。

use DateTime;
use Data::Printer;
my $dt = DateTime->from_epoch( epoch => time );
p($dt);
于 2013-08-02T18:38:19.020 に答える
2

PERLトランスレータは、引用符内の奥行きの認識が限られています。それらを削除すると、問題が解決するはずです。または、引用符内に印刷できる単純な変数に実際の値をロードするだけです。他のオブジェクトへのポインタを含むオブジェクトがある場合は、これを行う必要があるかもしれません。

SwissArmyChainSaw =/= PureMagic:
print("xxx".$this->{whatever}."rest of string\n");
于 2016-05-22T04:00:04.777 に答える
1

問題は$snap、文字列内で補間されていることですが、これ$snapは参照です。「参照を文字列としてperldoc perlref使用すると、perlobjで説明されているパッケージの祝福を含む、その指示対象の型と、16進数で表された数値アドレスの両方が生成されます。」

つまり、文字列内では、を逆参照することはできません$snap。あなたの最初の試みはそれをする正しい方法でした。

于 2012-11-05T20:34:41.433 に答える
0

私はほとんどのコメントに同意します。読みやすいように連結に固執します。使用できます

いう

「\n」を使用せずに印刷する代わりに。

于 2019-07-05T09:21:07.580 に答える