Perl 出力に HASH(0xABCDEF) が表示されるのはなぜですか?
-
22-08-2019 - |
質問
sun4-solaris-64int 用に構築された Perl、v5.6.1 を実行しています。
配列に対して print を呼び出しています。
print "@vals\n";
出力は次のようになります。
HASH(0x229a4) uid cn attuid
または別の例:
@foo = {};
push(@foo, "c");
print "@foo I am done now\n";
出力は次のとおりです:
HASH(0x2ece0) c I am done now
どこですか HASH(0x2ece0)
から来る?
解決
@fooにある括弧= {}は、それを作成しています。中括弧は無名のハッシュリファレンスを作成します。
あなたは空のリストに@foo設定したい場合は、@foo使用=()
他のヒント
この種の問題を理解する鍵は、あなたが出力に余分なアイテムを得ることです。これは、その項目が何であるか、あまりにも重要ではありません。
一般的に、あなたは、コンテナの変数は、あなたが期待するよりも、その中に多くの(または少ない)を持っているときに実行したいと思いますまず最初は、それの内容を見ることです。データ:: DumperのモジュールはPerlのが付属してすることができ、かなりあなたのための印刷データ構造ます:
use Data::Dumper;
print Dumper( \@foo );
あなたはコンテナにあるものを見たら、、あなたはそれがそこで得た方法を見つけるために後方に作業を開始することができます。あなたはそれが既にあなたが望んだものではありません一つの要素を、持っていたこと@foo初期化した後に、最終的にその権利を気付いてしまうと思います。
もう一つのトリックは、リスト内の要素の数をチェックすることです。
print "There are " . @array . " elements in \@array\n";
あなたが期待していない番号を取得する場合、余分な要素が現れた時には、見つけるために後方に動作します。
@foo に誤ってハッシュ参照が含まれています。逆参照せずに参照を出力すると (ほとんどの場合偶然)、デバッグ文字列 (参照の種類とメモリの場所) が得られます。
あなたが欲しいと思います my @foo = (); push @foo, "c";
今持っているものよりも。一方で、単純にこう言うこともできます my @foo;
配列を作成します。次のように明示的に空としてマークする必要はありません。 ()
.
見る perldoc perlreftut
そして perldoc perlref
参考資料の詳細については。
あなたのコードは次のように記述する必要があります:
use strict;
use warnings;
my @foo;
push @foo, "c";
print "@foo I am done now\n";
あなたは空の変数を持つようにしたい場合は、Perlで変数を初期化する必要はありません。ただし、ローカル変数を宣言するmy
を使用する必要があります。そして、あなたはただ混乱を追加することを、組み込み関数の周りに括弧を必要としません。