• ベストアンサー

forの中の処理がわかりません

こんばんは。 forの中の処理がわからないので質問させてください。 以下のような内容のファイルの処理で、 ------------------------------------------------- ■大項目1  ○中項目1   ・小項目   ・小項目  ○中項目2   ・小項目A   ・小項目  ○中項目3   ・小項目   ・小項目 ■大項目2  ○中項目1   ・小項目A   ・小項目 ■大項目3  ○中項目1   ・小項目   ・小項目A ■..... ----------------------------------------------- ■から次の■までの、大項目・中項目・小項目のセットの中で、 大項目が指定した文字列($xx)を含み、かつ一番目の小項目が指定した文字列($yy)を含む場合に、中項目の内容を置換するというスクリプトを書いています。 ひとつのセットの中に中項目が1つしかない場合はうまくいくのですが、複数の中項目がある場合の処理がどうしてもわかりません。 それぞれの中項目の一番目の小項目が指定した文字列を含んでいたら、その中項目を置換したいのですが、下のスクリプトの★マーク部分の処理はどうやったらいいのでしょうか。 どうかご教示お願いいたします。 ------------------------------------------------------------- $xx = "大項目"; $yy = "小項目A"; while (<>) { last if /^■/; } while (/^■/) { $dai = $_; @set = (); @syou = (); $dai_match = 0; $count_chuu = 0; $syou_match = 0; push(@set, $_); while (<>) { last if /^■/; if ($dai =~ $xx) { $dai_match = 1; } if (/○/) { $count_chuu++; #中項目の数をカウント } if (/・/) { push(@syou, $_); if (@syou[0] =~ "$yy") { $syou_match = 1; } } push(@set, $_); } if ($count_chuu >= 2 && $dai_match == 1) { #中項目が2つ以上で、大項目がマッチしている場合 for (@set) { # ★ } } elsif ($count_chuu == 1 && $dai_match == 1 && $syou_match == 1) { #中項目が1つで、大項目と小項目がマッチしている場合 for (@set) { s/○/●/; #中項目を置換 } } print @set; }

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

  • ベストアンサー
noname#98692
noname#98692
回答No.3

最初の質問の内容をちゃんと理解していませんでした。申し訳ないです。 それぞれの中見出しについて処理するようにしてみました。 DOM について調べれば、沢山の解説サイトが見つかります。DOM の使い方は言語に依存しないので、JavaScript での解説でも使い方を知るには十分だと思います。(DOM の入門向けの解説は、JavaScript によるものが多いので)

pa_baraban
質問者

お礼

うまくできました! とても丁寧にご説明いただき、本当に勉強になりました。 DOMについても勉強します。 本当に助かりました。ありがとうございました!

その他の回答 (2)

noname#98692
noname#98692
回答No.2

No.1 さんの言われるとおり、「データを最初に全部読み込んで適切な構造に保存し, あとでその構造を参照しながら変形していく」の方がわかりやすいと思います。 一応作ってみました。全部自分でやるのは面倒だったので DOM 使ってしまいましたが・・・

pa_baraban
質問者

補足

ありがとうございます! 試してみたのですが、 以下のように、置換対象となる中項目が2番目以降にある場合も置換したいのですが、この処理はどうやったらいいのでしょうか。 モジュール使うの初めてで、いまいちイメージがつかめていません・・・。 ------------------------ ■トリ  ○猛禽   ・ワシ   ・タカ  ○たべられる   ・ニワトリ   ・ハト ------------------------- ご迷惑でなければ補足いただけないでしょうか。 よろしくお願いします。

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

今のままいこうとすると, 「大項目の最後にまとめて処理する」ってのは難しいと思う. とりあえず「次の小項目をチェックする」というフラグを作り, 中項目を読み込んだときにそのフラグを立てる. で, 小項目を読み込んだときにこのフラグをチェックし, 立っていればしかるべき処理をして落とす. それでいいんじゃないかなぁ. 「最初の小項目」を読み込んだ時点では「その小項目を含む中項目」は @set の最後にあるから $set[-1] で参照できる. ただ, 「データを最初に全部読み込んで適切な構造に保存し, あとでその構造を参照しながら変形していく」方がわかりやすいプログラムになりそうな予感がする. 今は全ての項目をフラットな配列に入れてるけど, 項目間に親子関係があることを考えると違う構造を考えてもいいと思う.

pa_baraban
質問者

お礼

ご回答ありがとうございました! わかりやすいプログラムが書けるように勉強します。

関連するQ&A