• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:foreachについて)

foreachについて

このQ&Aのポイント
  • foreachは配列などの一連のスカラー値を持つリストから順に要素を取り出し、スカラー変数に代入してからブロック内の処理を繰り返します。
  • @BCOLは最初要素を含んでいない場合、foreachを実行しないでしょう。
  • $BCOLに{}を追加すると、新しい要素が@BCOLの最後に追加されます。

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

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

最初にコメントしておきますと, このプログラムはどうも「今一つ」な感じが否めなかったりします. 区コードを見付けたかどうかのフラグの変数名や値がおかしい (普通なら $found_ku のように過去形の名前を使うだろうし, 「見付けたら 1, 見付からなかったら 0」という値の設定をすると思う) ですし, こんなところでわざわざ普通の配列を使う使うのも謎. ハッシュ使えばいいのに. 閑話休題 順番は逆ですが (3): use の引数は通常「モジュール」と呼びますが, 小文字で始まるものは特別に「プラグマ」と呼ぶことがあります. それはともかく, foreach の変数であれば事前に my しなくても foreach my $KU_RECt (@BCOL) のようにその場で宣言することができます. この場合, その変数は foreach の中でのみ有効となります. (2): このような処理をしている理由はよくわかりません. $KU_REC に $REC{KU_CODE} で与えられる区コードを持つデータを取り出したいんでしょうけど, だったらなぜ素直にハッシュを使わないのかが謎です. my %BCOL; unless (defined $BCOL{$REC{KU_CODE}}) { $BCOL{$REC{KU_CODE}} = { KU_CODE => $REC_KU_CODE }; } $KU_REC = $BCOL{$REC{KU_CODE}}; ですむんですけどねぇ (本当はもっと短くできますが). で, if ($KU_RECt->{KU_CODE} eq $REC{KU_CODE}) というコードがある以上 @BCOL の中のデータは KU_CODE というキーを持つハッシュ (へのリファレンス) でなければならないのですが, 示されたコード中に設定している部分がないので「必要である」と判断しました ($KU_REC に @BCOL の中のデータのいずれかが入っているのですが, このデータはハッシュへのリファレンスですから $KU_REC->{} という形でアクセスできます. つまり $KU_REC->{KU_CODE} = $REC{KU_CODE}; という文で区コードを入れています).

cshoaucmoa
質問者

お礼

返答ありがとうございました。なんか、私の理解の段階がまだここに達していないように思いました。もう少しがんばります。

その他の回答 (1)

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

なんかコードがちょっと足りないような.... (1): foreach $var (@BCOL) { .... } は, 配列内の値かそれともコピーした値かという違いを除けば for ($i = 0; $i <= $#BCOL; $i++) { $var = $foo[$i]; .... } と同じ動作をします (foreach だと配列内の値をそのまま指すので変数に代入すると配列の値も変わる). なので, 配列が空の場合には foreach 内の文は実行されずにその次を進みます. (2): {} は空ハッシュへのリファレンス. 配列 @BCOL に対して $#BCOL は @BCOL の最後の要素の添字. だから push(@BCOL, {}); $KU_REC = $BCOL[$#BCOL]; を実行すると「配列 @BCOL に空ハッシュへのリファレンスを追加し, 今追加した値を $KU_REC に代入する」ことになります. ん~, でも $KU_REC->{KU_CODE} = $REC{KU_CODE}; とかなんとかってコードがないと意味がないような.... (3): strict プラグマを使わなければ my を付けなくてもかまいません. 逆に, strict プラグマを使った場合には必ず my で宣言しなければなりません.

cshoaucmoa
質問者

お礼

返答ありがとうございます。理解したいと何度も読んだのですが、まだいまいち理解できていないところが・・・。 (1) やっぱり通らないのですね。ということは$KU_RECに値がはじめて入るのは(2)の部分になるのですね。 (2) 処理の中身としては理解したのですが、どういう意味があるのか、というところは以前不明です。@BCOLに空のリファレンスをいれる、とはkeyも値も空のものを入れる、ということですかね?それを追加したものを$KU_RECに代入すると、それに対するリファレンスは $KU_REC->{} となるのでしょうか?なぜそのような処理が必要なのでしょうか? (3) strict プラグマって use strict;という記述のことでしょうか?このモジュールの最初に記述があります。となるとやっぱり$KU_RECtに対してもmy($KU_RECt);の記述が必要になるのでしょうか?現状はないのですが・・・。 上記記述はそれ自体がさらにLOOPされていて、何度もこのロジックを通るので、さらにご指摘の通り、この記述の次に $KU_REC->{KU_CODE} = $REC{KU_CODE}; という記述があります。どういうところからこの記述が必要と思われたか、また聞かせていただけるとうれしいです。 ※if ($KU_RECt->{KU_CODE} eq $REC{KU_CODE}) { という記述がある限り、どこかで@BCOLの中に区コードが入るんだろうなと思うのですが、その記述がどれにあたるのかまだ見出せません・・・。

関連するQ&A