• ベストアンサー

push(@array, {}); について

いつもお世話になります。 いまperlのプログラムを読んでいるのですが、 push(@array, {});  という記述があり@arrayという配列の最後に値を追加しているというのはわかるのですが、どんな値なのか、つまり{}の意味がわかりません。スペースでしょうか? よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

基本的にはperlの配列は一次元のスカラーなデータしか持てませんので、この場合は無名ハッシュのリファレンスと言うことになります。 配列の要素へのアクセスは[]を使いますよね。 $a[2] みたいな感じです。これと同じようにハッシュは $a{'abc'} みたいな感じで使います。 つまり[]は配列、{}はハッシュです。 この場合{}の前に何も名前がないので無名ハッシュとなります。 それで配列の要素はスカラーなので無名ハッシュのリファレンスと言うことになります。 何かを初期化するためのものでしょうか? ちなみにperlはCなどとは違い初期化していなくてもいきなり使えます。しかしわたしはわかりやすいようにあえて明示的にこのように初期化するのが好きですが。 この例だと push(@array, { 'abc' => 'ABC' }); こんな感じで使うと、 $array[0]->{'abc'} は ABC となります($array[0]{'abc'}でも構いません)。 将来的にこんな感じで@arrayを使いたいのだと思います。これはそのための初期化だと思われます。

cshoaucmoa
質問者

お礼

お返事ありがとうございます。 うーん。なんかぴんときません。でもこれは説明の問題ではなく私の理解力の問題だと思います。 無名のハッシュというのを入れておくことで初期化されるとのことですが、それを行わなかったらどうなるのでしょうか?もともとVBの人間で、基本的に変数を宣言したときに初期値が入っているのがあたりまえだったものですから、その辺の概念から勉強せねばなりませんね。 ありがとうございました。

その他の回答 (1)

回答No.2

>お返事ありがとうございます。 >うーん。なんかぴんときません。でもこれは説明の問>題ではなく私の理解力の問題だと思います。 >無名のハッシュというのを入れておくことで初期化さ>れるとのことですが、それを行わなかったらどうなる>のでしょうか?もともとVBの人間で、基本的に変数を>宣言したときに初期値が入っているのがあたりまえだ>ったものですから、その辺の概念から勉強せねばなり>ませんね。 perlは他の言語に比べると変数の管理が厳密ではありません。この辺がperlのメリットでもあり同時にデメリットでもあります。 他の言語では変数は使う前に宣言しておかなければいけません。その変数が整数型なのか文字型なのか等です。当然整数型の変数に文字列を入れるとエラーになります。 perlは変数を宣言なしでいきなり使えます。おまけに変数の型も曖昧です。時には整数のように振舞うこともあれば、同じ変数なのに使い方次第で文字列になったりもします。 変数型が厳密な言語からperlにくれば最初にそのことに驚くはずです。 リファレンスも当然定義なしで使えます。これをソフトリファレンスと呼びます。上の例ですと、いきなり $array[0]->{'abc'} = ABC; こんな感じで使えます。ただソフトリファレンスはバグの元だと思いますのでわたしはあまりお勧めできません。そこで、 push(@array, {}); こう言う風にしておくと、後で見たときに@arrayは無名ハッシュのリファレンスの配列だとわかるのです。何回も言いますけど、この宣言はなくてもいいのです。この宣言は言語的に必要と言うよりプログラマがわかりやすいようにした一種のコメントのようなものだと思って下さい。 perlは変数宣言や初期化が必要ない言語なのです。

cshoaucmoa
質問者

お礼

なるほど、要はpush(@array, {}); をしておくことで、この@arrayは今後ハッシュを格納する配列として使いますよ、って感じのことを明示化する、というイメージでしょうか?少しつかめてきた気がします。ありがとうございました。

関連するQ&A