2

私は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)から来たの?

4

4 に答える 4

14

@foo={}の中括弧がそれを作成しています。中括弧は、名前のないハッシュ参照を作成します。

@fooを空のリストに設定する場合は、@ foo =()を使用します。

于 2009-04-02T13:30:52.700 に答える
6

この種の問題を理解するための鍵は、出力に余分な項目があることです。そのアイテムが何であるかはあまり重要ではありません。

一般に、コンテナー変数の内容が予想よりも多い (または少ない) 場合に最初に行うことは、その内容を確認することです。Data::Dumper モジュールは Perl に付属しており、データ構造をきれいに出力できます:

use Data::Dumper;
print Dumper( \@foo );

コンテナに何が入っているかを確認したら、逆方向に作業を開始して、コンテナにどのように入ったかを調べることができます。最終的には、@foo を初期化した直後に、既に 1 つの要素が含まれていることに気付きますが、これは望んでいたものではありません。

もう 1 つのトリックは、リスト内の要素の数を確認することです。

print "There are " . @array . " elements in \@array\n";

予期しない数値が得られた場合は、逆方向に作業して、余分な要素がいつ表示されたかを調べます。

于 2009-04-02T14:20:29.570 に答える
4

誤って@fooにハッシュ参照があります。参照を逆参照せずに(ほとんどの場合偶然に)出力すると、デバッグ文字列(参照の種類とメモリの場所)が表示されます。

my @foo = (); push @foo, "c";今持っているものよりも欲しいと思います。一方、単にmy @foo;配列を作成すると言うこともできます。で空として明示的にマークする必要はありません()

参照の詳細についてはperldoc perlreftut、およびを参照perldoc perlrefしてください。

于 2009-04-02T13:37:25.960 に答える
3

コードは次のように記述する必要があります。

use strict;
use warnings;

my @foo;
push @foo, "c";

print "@foo I am done now\n";

空の変数が必要な場合は、Perlで変数を初期化する必要はありません。ただし、を使用myしてローカル変数を宣言する必要があります。また、組み込み関数を括弧で囲む必要はありません。これにより、混乱が生じるだけです。

于 2009-04-02T13:46:01.337 に答える