変数の構造についての質問

このQ&Aのポイント
  • 変数の構造についての初歩的な質問です。配列の中にハッシュが入っているのかどうかを知りたいです。
  • $list変数は、配列の中にハッシュが入っている構造です。idとnameの情報がハッシュ形式で格納されています。
  • PHPに詳しいがPerlを理解できていない質問者です。[]や{}がどのような意味を持つのか知りたいです。
回答を見る
  • ベストアンサー

変数の構造について

初歩的な質問ですみません。 以下のような変数はどんな構造になっているのでしょうか? 配列の中にハッシュが入っているのかと思っているのですが・・ $list = [ { id => '1', name => 'hoge' }, { id => '2', name => 'fuga' }, { id => '3', name => 'foo' } ]; 上記の$listにあるidを全て出力しようとして以下のようにしても 出力することができません。 foreach ($list) { print $_['id']; print '<br>'; } また「[]、{}」は何を意味するのでしょうか? 当方、PHPには詳しいのですがPerlは最近始めたばかりでよく理解できておりません。 お手数ですが、どなたかお分かりになる方いましたらご教授いただければと思います。

  • CGI
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

無名配列、無名ハッシュ、リファレンス 以上をキーワードに調べてみてください。 $listはハッシュの配列(もっと正確に言えば、「『ハッシュへのリファレンス』を要素にもつリスト」へのリファレンスになります) > foreach ($list) { これでは、$listが示すリファレンス一つだけのforeachになります。 $_ == $list となります。 また、Perlでは、インデックスを指定する場合に使うのは、リストには[],ハッシュには{}です。 $_['id'] では、'id'は数値0だと判定され、$_[0]の意味になります。 合せれば、$_['id']は $list[0] にあたり、{ id => '1', name => 'hoge' }(へのリファレンス)になります。 printでは そのことを示す HASH(0xXXXXXX) というような表示になったのでは無いでしょうか。 リファレンスから元の値にするには、デリファレンスと呼ばれる処理が必要です。 foreach (@$list) { # 配列のリファレンスを@でデリファレンス→リストになり、 #リストの要素であるハッシュのリファレンスが順番に$_へ入る print $_->{'id'} ; # ハッシュのリファレンスの中の特定要素へは->を使ってアクセスする。 # ハッシュのインデックスは{}で指定する。 > また「[]、{}」は何を意味するのでしょうか? $list=[~ では、 []は無名配列、{}は無名ハッシュですが、どちらの記号も他の場面でも使われています。 その文脈で判断する必要があります。 Perlは不慣れ、とのことですが、PHPとは似ているようで結構違います。半端にやらずに、区別して覚えるようにしましょう。

mookun2007
質問者

お礼

大変分かりやすい回答をいただきありがとうございました。 > Perlは不慣れ、とのことですが、PHPとは似ているようで結構違います。 そうですね、結構違うなっていうのを実感しております。 しっかり勉強しようと思います。 また機会がございましたらよろしくお願いいたします。

関連するQ&A

  • Python のクラスのメンバ変数

    class foo( object ):        __result = []        def __init__( self, n, m ):       # self.__result = []       self.__result.append( n + m )    def func( self ):       print self.__result[0] hoge = foo( 1, 2 ) fuga = foo( 3, 4 ) hoge.func() # 3 fuga.func() # 3 ... !? 数値や文字列といったメンバ変数は、コンストラクタで意図的に初期化してやらなくても正常な値になりますが、それ以外のオブジェクトや配列だと fuga は hoge のメンバと同じものになってしまいます。他の言語の感覚ですと、__result は foo のメンバな上にプライベートなので、fuga の __result が hoge.__result を指すのは考えられない事なのですが、この書き方がマズいのでしょうか。 また、もしこのようになっている理由等もありましたら、併せてお教えください。

  • 連想配列の配列の使い方

    C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt");  $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }

    • ベストアンサー
    • Perl
  • 連想配列とforeach

    連想配列 %hogeにおいて、.name の名前が最後に付く配列の値を取り出したいと思い、下記のようにしました。 foreach ($hoge{/.*\.name$/}) {  print "$_\n"; } としてみましたが期待した出力がされませんでした。こういう描き方って出来ないんでしょうか?それともどこか間違ってますか?

    • ベストアンサー
    • Perl
  • チェックボックスから配列を使って値を受け取る方法

    チェックボックスから配列を使って値を受け取る方法について、 以下の通りに試してみたのですが、上手く行かず、 配列$fCに値が入りません。 どなたか原因を教えていただけないでしょうか。 ------------------------------------------------ hoge.html <form action="hoge.php"> <input type="checkbox" name="fC[]" value="hoge"> hoge <br> <input type="checkbox" name="fC[]" value="foo"> foo <br> <input type="checkbox" name="fC[]" value="bar"> bar <br> <input type="submit" value="OK"> </form> ---------------------------------------------------------- ------------------------------------------------- hoge.php <? for( $i=0; $i<count($fC); $i++ ) { print $i ." ::: " . $fC[$i] . "<br>\n"; } ?> ----------------------------------------------------------

    • ベストアンサー
    • PHP
  • actionscript 2.0 配列型変数をグローバル変数として扱いたい。

    action script2.0で ある変数を、共有しようと、ムービークリップに _global.hoge = _name(ムービーのインスタンス名); というような記述をしました。 すると、たしかにほかのどのムービークリップでも hogeという値は取り出すことができました。 ところが、インスタンスはひとつではなく複数あるため、 _global.hoge = _nameが記述されているムービークリップがいくつもあると、 次々上書きされ、結局hogeは、最後に読み込んだ _nameの値が入ってしまうという現象が起きたのです。 そこで _global.hoge[_name] = _name; というような、変数名がかぶらぬよう配列に変更してみました。 ところが、また問題が発生しました。 なぜか、配列だと頭に_globalとついていても グローバル変数として扱ってくれず、 ほかの場所で hoge[1] 等と記述しても全く値が取り出せないのです。 また、同ムービークリップ内ではちゃんと取り出せました。 どうすれば、配列変数をグローバル変数として 扱うことができるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • 配列を返す関数

    Perlではこのようにして複数の値を返して変数に一度に代入することができますが、 ($foo,$bar) = &hoge(); print "$foo,$bar\n"; sub hoge { return ('foo','bar'); } PHPでも同様のことはできますか? それとも以下のように分けて書くしかないですか? <?php $a = hoge(); $foo = $a[0]; $bar = $a[1]; print "$foo,$bar\n"; function hoge() { return array('foo','bar'); } ?>

    • ベストアンサー
    • PHP
  • Bシェルで不定変数名を変数として取り扱うには

    ファイル(test.txtとします)に 0755 $HOGE/herehere $FOO/bar のような形で変数を示す文字列がはいっています。 どんな変数名かは事前にわかりません。 これをシェルプログラムで、 $が付いていたら変数名と解釈して使用したいです。 どんな変数名がファイルに含まれているかがわかっているなら、 以下のようにできたのですが、 変数名が不明のときにはどうしたらファイルに含まれている変数を そのまま使用できるのでしょうか。 HOGE=`command HOGE` #HOGEを引数にcommandコマンドを呼び出した結果を$HOGEとする FOO=`command FOO` #↑test.txtの中には$HOGEや$FOOが何度も出てくるので、 #出てくるたびにcommandコマンドを使うのは避けたい。 while read LINE do  FILE=`echo $LINE|sed "s%"'$HOGE'"%$HOGE%g"` done < /test.txt

  • 変数の疑問

    プログラム初心者です 変数について教えてください 質問1 変数に代入する値の中で改行しても問題ないでしょうか? while ($table = mysqli_fetch_assoc($recordSet)) { $cells .= "<tr> <td>{$table['id']}</td> <td>{$table['name']}</td> <td>{$upday}</td> </tr>".PHP_EOL; } 質問2 変数に格納できるものはなんでもありですか?関数も入りますか? こんなことはしないですが実験的にやってみたら表示されました $hoge = print "hoge"; 戻り値がないもの、この場合は、出力結果がはいるのでしょうか? よろしくお願いします

    • ベストアンサー
    • PHP
  • 変数に格納できる桁数に制限はあるの?

    スカラー変数に格納できる桁数に制限はあるのでしょうか? 制限があるとすれば、どうすれば解除できるのでしょうか? 具体的には下記のような手順です。 小数15位まである数値(整数部は3桁)を変数($hoge)に代入する。 $hoge = 123.123456789012345; 次に、この変数を他の変数($fuga)に代入する。 $fuga = $hoge; さらにこの変数をSmarthに渡してブラウザに表示させると、小数点以下が12桁までしか表示されません。 どうすれば15桁をそのまま表示させることができるのでしょうか? よろしくお願いします。

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

    下記のような例の場合は、どのようにすれば【意図した結果】のようになりますでしょうか? 【コード】 <?php $post['thread_id'] = 1; $thread_id = $post['thread_id']; $logs = array( array(1, 0, $post['thread_id'], '<a href ="thread.php?id=$thread_id">編集</a>', '削除'), ); foreach ($logs as list($no, $oya, $kiji, $edit, $delete)) { if ($oya > 0) { continue; } print $no .'<br>'. $kiji . $edit . $delete . '<br>'; listchild($logs, $no); } function listchild($logs, $parent) { $ct = 0; foreach ($logs as list($no, $oya, $kiji, $edit, $delete)) { if ($oya !== $parent ) { continue; } if ($ct++ == 0) { print '<nobr>&nbsp<ul></nobr>'; } print '<li>' . $no .'<br>'. $kiji . $edit . $delete . '<br>' . '</li>'; listchild($logs, $no); } if ($ct > 0) { print '&nbsp</ul>'; } } 【結果:編集のリンク先】 「thread.php?id=$thread_id」 【意図した結果】 「thread.php?id=1」

    • ベストアンサー
    • PHP

専門家に質問してみよう