• ベストアンサー

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

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

  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
回答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

  • array_push関数について

    array_push関数を使って配列に追加していくことはできるのですが、多次元配列に追加する方法がわかりません。 WEBマニュアルを見ても詳しく書かれておらず困っています。 array_push関数で多次元配列に追加していくことはできるのでしょうか? できるのであれば簡単な書式をご伝授ください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Array配列の末尾に追加したい。

    MyString = Array("0です","1です","2です") ↑これの後ろに、"3です" を追加したいのですが、 どうしたらいいですか? Perl で言う、Push関数の様なものが欲しいのですが。。

  • array_intersectで空欄を比較しない

    お世話になります。 $arr1 = array(1,2,3); $arr2 = array(2,3,4); という配列が存在していたとき、これらすべてに共通する値を取り出すとき、 array_intersect($arr1,$arr2) で良いと思うのですが、上記に更に値があるか分からない配列($arr3,$arr4)を比較したいときどのように記述すればよいでしょうか? $array_list[] = $arr1; $array_list[] = $arr2; if($arr3 != NULL){$array_list[] = $arr3;} if($arr4 != NULL){$array_list[] = $arr4;} $array_list = implode(",",$array_list); と半ば強引に配列に追加したのですが、var_dump($array_list)したところ、 Array,Arrayとなってしまいました。 $arr3,$arr4に値が入っている場合と入っていない場合でif分岐させて、 array_intersect($arr1,$arr2) array_intersect($arr1,$arr2,$arr3) array_intersect($arr1,$arr2,$arr4) array_intersect($arr1,$arr2,$arr3,$arr4) の4パターンを書くこともできるかと思いますがスマートではないような気がしまして・・・。 なにかよい方法が有りましたらよろしくお願い致します。

    • ベストアンサー
    • PHP
  • array()の中に変数の値(テキスト)を入れたい

    いつもお世話になっております。 PHP5.3で、 $number = '1,2,3,4'; という文字列の値が入った変数があり、この変数を"array()"の()の中に呼び出したいのですが定義の仕方が分かりません。 イメージとしてはarray($number)のような感じで、array(1,2,3,4)という配列を定義したいです。 (勿論↑では動きませんでした;) ご教授宜しくお願い致します。

    • ベストアンサー
    • PHP
  • array_uniqueについて

    こんにちは。質問させてください。 array_unique関数はPHP4.04以降は使用できないと マニュアルに記述されていました。 ですがどうしても配列内の重複した値を 削除したいのですが、ロジックがうまく 思いつけません・・・ どなたかわかる方はいらっしゃいますか? $test_array = array("america","japan","america","canada","japan"); ⇒ ("america","canada","japan") しかもソートしたいです!! 宜しくお願い致しますm(_ _)m

    • 締切済み
    • PHP
  • Array 関数について

    以前、成分解析プログラムで質問したものです。 あれからどうにかこうにかなっていますが、 どうしてもわからないものがあります。 それはArray関数です。 VBSでは「配列が格納されたバリアント型 (Variant) の値を返します。」とありますが、 それに相当する関数の類はVB.NETではいまいちわかりません。 どういう関数を使えばよいのでしょうか?

  • perlで2つの配列を比較する方法について

    こんにちは、perlについての質問です。 2つの配列を比較するで調べたところ、"@deff = grep { !{map{$_,1}@array2 }-> {$_}}@array1;"で比較ができると書かれていました。perl初心者ですので、よくわからず、自分なりにこの処理について調べてみましたが、わかりませんでした。この処理の詳細がわかる方いましたら、教えてください。(特にmap($_,1)@array2 の部分がよくわからなかったです) よろしくお願いします。

  • array_randの改善・配列からランダムにキーを取得

    配列からランダムに値を取得したい。関数array_randを用いると可能だが、同じ値を繰り返し取得してしまうことがある。この点を改善したい。方法をおしえてください。 (例) 配列 1,2,3,4,5,6,7,8,9 からarray_randでランダムに1つ選ぶ。 1回目、4が選ばれる。array_randの場合、2回目も4が選ばれてしまうことがある。これを4以外の8つの値から1つを選ぶように改善したい。これを繰り返す。最後は配列が空になるようにしたい。 状況 phpを実行する都度、配列は、別ファイルのデータを読み込んで使用している。実行するユーザーの識別が必要でしょうか?

    • 締切済み
    • PHP
  • perlのpushについてです。

    お世話になります。perlのpushについてです。 データファイルを読み@XXに入れます。 実際はもうちょっと複雑なのですが、 foreach $DATA (@XX){$CHECK=''; ($A,$B)=split(/\,/$DATA); # $Bには改行コードを含んでいます。 if ($A==1){$A=2;$CHECK=1;} if ($A==2){$A=3;$CHECK=1;} if ($A==3 and $B==1){$A=1;$B=9;$CHECK=1;} if ($CHECK==1){ push(@N,"$A,$B");}else{ push(@N,"$DATA"9;} } として、@Nをファイルに出力すると1行目を除き、 行の先頭になぜか空白が付いてしまいます。 別のスクリプトで読むときに数字以外は削除というような 文を加えても削除できず、 if ( $A eq '1'){・・・・ としたときにマッチしてくれません。 よって、この最初にファイルに書き出す際に空白が付かないように したいのですが、何故付いてしまうのか?、回避方法は? ご指導頂けたら幸いです。 付いてしまいます。

    • ベストアンサー
    • Perl
  • arayy_pushの挙動は?

    arayy_pushの挙動は? file関数で読み込んだカンマ区切りのデータ(改行コードはLF)をlist(data1,data2,data3)として、data3には改行コードが含まれたまま、全てのデータ(data1,data2,data3)の最後にaray_push関数で末尾にデータを追加(data4とする)した場合には、data3とdata4の改行コードはどうなるのでしょうか? array_pushのマニュアルには何も書いてなく、自動的にdata4には改行コードが付加されるか確認する方法がわかりません。 アドバイスをお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう