Perl/配列のループで$data->{start_hour};が取得できない理由

このQ&Aのポイント
  • Perlの配列のループで$data->{start_hour};が取得できない理由について教えてください。
  • foreach文を使用して配列の要素をループで処理する際、$data->{start_hour};が機能しない問題が発生しています。
  • ループの中で$data->{start_hour};を使用して配列の要素を取得しようとすると、最初の要素のみが正常に取得され、それ以降の要素では取得できない状況です。なぜこのような問題が起きるのでしょうか?
回答を見る
  • ベストアンサー

Perl/配列のループに関して教えてください。

my @shop = [ {'start_hour'=> '1100','shift'=> [1,2] }, {'start_hour'=> '1130','shift'=> [1,3] } ] という配列があってそれをループで回したいのですが、 ▼以下だとNG foreach my $data (@shop){print $data->{start_hour};} ▼以下だと最初の1つだけOK foreach my $data (@shop){print $data->[0]->{start_hour};} という状況です。なぜ$data->{start_hour};で取得できないのでしょうか? 助けて頂けるとうれしいです★

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

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

[] は (無名) 配列へのリファレンスを生成し, リファレンスはスカラです. つまり my @shop = [ {'start_hour'=> '1100','shift'=> [1,2] }, {'start_hour'=> '1130','shift'=> [1,3] } ]; とすると, @shop は「2個の要素を持つ配列へのリファレンス」という 1個の要素しか持ちません. やりたいことは, 本当は my @shop = ( {'start_hour'=> '1100','shift'=> [1,2] }, {'start_hour'=> '1130','shift'=> [1,3] } ); だったりしませんか?

その他の回答 (1)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.2

配列に()か[]かの、びみょーな違いです。 my @shop = ( {'start_hour'=> '1100', 'shift'=> [1,2] }, {'start_hour'=> '1130', 'shift'=> [1,3] } ); foreach my $data (@shop) { print $data->{start_hour}; } または my $shop = [ {'start_hour'=> '1100', 'shift'=> [1,2] }, {'start_hour'=> '1130', 'shift'=> [1,3] } ]; foreach my $data (@{$shop}) { print $data->{start_hour}; }

関連するQ&A

  • Perlで配列の添え字を抽出したい

    Perl初心者で、既出の質問かもしれませんが、ご教授願います。 以下のように"*"が入っている値を抽出する処理があります。 ーーーーーー処理ーーーーーー @array = ('aaa', 'b*b', 'ccc', 'dd*'); foreach (@array) { if ($_ =~/\*/) { print "OK\n"; } else { print "NG\n"; } } ーーーーーーーーーーーーーーーー ーーー結果ーーー NG OK NG OK ーーーーーーーー <質問> 上記結果より、OKとなった値の配列(添え字)を取得するにはどのようにすれば宜しいでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • perlでの三次元配列の作り方

    perlで三次元配列をテキスト入力から作りたいのですが、例えば二次元配列の場合 foreach $line (@input) push @data, [split /[:]/, $line]; で@dataが二次元配列になるのですが、三次元配列の場合このあとに push @output, \@data; とするとリファレンスが同じであるためループをまわしてもうまく三次元になりませんよね。 解決法はありますでしょうか?

  • 配列同士の足し算のループ処理

    まず、初心者ですよろしくお願いします。 $data1=(3,2,4,0,2,3,5,4); $data2=(2,4,0,2,3,1,4,1); と配列が2つあって、合計した配列をあらたに作りたかったのですが、 $goukei=($data1[0]+$data2[0],........[7]) としたら出来たのですが、ループでやりたかったので for($i=0; $i<8; $i++) { $goukei[] = ($data1[i]+$data2[i]); } としましたができませんでした。 $i=0; foreach( $data1 as $v) { $goukei[] = ($v+$data2[i]); $i++; } もだめでした。 どうすればできますでしょうか?

    • ベストアンサー
    • PHP
  • 配列生成される限り、ループしたい

    function arrayxml (){ urlで取得したXMLから、配列を取得 return $hairetu; //戻り値は多次元配列 } $data = arrayxml(); $cnt = count($data); do { for ($i=0; $i < $cnt; $i++) { $data = arrayxml($data[$i][0]); } } while (count($data) > 0); //関数によって配列が作られる限り このスクリプトではループはうまくされません。 $data = arrayxml($data[$i][0]);を--->arrayxml($data[$i][0]);にすると $cnt分ループされますが、do~whileのループはなされません。 関数で配列が生成される限り、do~whileループをさせたいのですが正しい方法を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • JavaScript で配列の終わりまでループ

    JavaScript で配列の終わりまでループを回すには どうしたらいいのでしょう? perl であれば foreach (@test) {  処理 } ですよね。。。test.length; で要素数を取得する以外で 方法はないでしょうか。 new Array を使って、2次元配列(のようなもの) を 作って格納してしまったので、test[0][*], test[1][*] それぞれの要素数を調べたいのです。 現状だと test[0][*], test[1][*] 2つの合計値が 返ってしまいます。

  • <Perl>参照配列の出力に失敗する。

    <Perl>参照配列の出力に失敗する。 お世話になります。 配列の出力部で以下のエラーが出力されます。 Use of uninitialized value in print at test2.pl line 12. -----コーディングは以下の通りです。----- #!C:\perl use strict; use warnings; my @l = (); #----------- #GetDataへCSVファイル名と、格納用配列を渡す #----------- my $cnt = &GetData("test.csv", \@l); print "COUNT -> ".$cnt; for(my $i=0; $i < $cnt; $i++){ print $l[$i]; } ################################################################## # 概   要:指定したCSVファイルをオープンしCSVデータを配列に取得する。 # パラメータ:ファイル名, CSVデータ格納用配列 # 戻 り 値:データ取得件数 ################################################################## sub GetData { my ($f, @bf) = @_; my $rcnt = 0; print "FILE NAME -> ".$f."\n"; if ( open(FP, "<${f}") ){ print "FILE OPEN -> success.\n"; @bf = split(/,/, <FP>); close(FP); $rcnt = @bf; print "CSV GET COUNT -> ".$rcnt."\n"; } return $rcnt; } -----実行結果は以下の通りです。----- D:\>perl test.pl FILE NAME -> test.csv FILE OPEN -> success. CSV GET COUNT -> 5 Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. COUNT -> 5 -----CSVファイルの内容は以下の通りです。(ファイル名:test.csv)----- あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの 配列の要素数が取れているので、配列内にデータは格納されているとは思っています。 出力方法をどのように正せばよいがご教示お願い致します。

    • ベストアンサー
    • Perl
  • 配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、

    配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、なぜダメなのでしょうか? $arr = array("値1", "キー1" => "値2", "値3"); foreach($arr as $key => $val){ $arr[$key] = "-{$val}-"; echo $val."<br />"; } foreach($arr as $key => $val){ echo "<br />".$val; } 上のforeachの結果が、下と同じようになると期待したのですが、うまくいきません。 なんで、上のforeachと下のforeachの結果が異なるのでしょうか? foreach文で要素の値が更新されるのは、foreach文が終了した瞬間なのでしょうか。 それとも、値はすぐに更新されているけれども、foreach文の処理(順番に抽出する作業?)は既にスタートしてしまっているので、ループ中に更新されても、途中で反映することはできない、ということなのでしょうか? さっぱり分からないので、誰か教えてください。 「配列の要素の値をループ中に変更して確認したい」というよりは、 「なんで、二つのforeach文で結果が異なるか知りたい」です。

    • ベストアンサー
    • PHP
  • 無名配列にスライスを使いたい。

    無名配列の要素へアクセスする際に、スライスを使いたいのですが どのようにすれば良いのでしょうか? まず、@table を3行×3列のテーブルにみたてて、テーブルを作成します。 my @table; for my $i (0..2){ for my $j (0..2){ $table[$i][$j] = ($i+1)*($j+1); } } foreach (@table){ print "@{$_}\n"; } # 出力結果 # 1 2 3 # 2 4 6 # 3 6 9 # 次に1列目のデータをすべて x にしたいのですが、以下のようにすればできることは理解できました。 foreach my $k (0..2){ $table[$k][0] = x; } # output # x 2 3 # x 4 6 # x 6 9 # ただ、これを以下のようにスライスを使って処理しようとすると・・・ ${@table[0..2]}[0] = x; foreach (@table){ print "@{$_}\n"; } # 出力結果 # 1 2 3 # 2 4 6 # x 6 9 # 明らかに目的とは違ったスクリプトになってしまっているのですが、なぜ上記のような出力になるのでしょうか? また、スライスを使って、一行目のデータをすべてxにする方法が ありましたらご指導くださいませんでしょうか。 長い質問になってしまいましたが、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 無名配列からハッシュを作りたいのですが・・・

    $VAR1 = [ 'No', 'a', 'i', 'u', 'e', 'o', ]; #VAR1と同じ数の<>区切りの下記のようなデータを読み込み配列に代入 --List----------------------- 1<>あ<>い<>う<>え<>お<> ------------------------- foreach(0..$#List){ @Array=split(/<>/,$List[$_]); } 最終的なイメージは print "$a{No}"; >1 print "$a{a}"; >a となるよう、上記VAR1の無名配列の値をキーに、読み込んだ<>区切りのデータを関連付けて表示させるようにしたいのです。 foreach my$var(@$VAR1){ ...ここをどうすれば配列の値をハッシュのキーとして作成出来るのか頭を悩ませてます。 } 先輩方のお知恵をお借りできませんでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • LISPではperlのforeachをどのように書くのでしょうか?

    LISPでの以下の配列の配列、(LISPでは何て呼ぶのかな?)の ひとつひとつの要素を表示させたいです。 (setq dat'( ( 1 2 3 4 5) ( 6 7 8 9 10) (11 12 13 14 15) ) ) LISPではperlのforeachをどのように書くのでしょうか? # Perlの場合 foreach(@pos){ foreach($_){ print "$_\n"; } } また、配列のサイズ今回の場合は1次元配列では3,2次元配列ではサイズが5ですが、LISPで配列のサイズを求める方法も知りたいです。

専門家に質問してみよう