• 締切済み

病院の当番表

perlを勉強中のものです。 病院のHPで使う当番表を作ろうと四苦八苦しております。 ログファイルには 名前・専門科目・受付時間 のようなものが<>区切りで20人分、20行くらいあります。 これを本日の当番ということで、 8つのプルダウンメニューで先生の名前を$name1~$name8(最大当番医8人)に割り当ててフォームから送られてくるようにしてあります。 8人分の名前が送られてきたものを ログファイルから拾って、それぞれの項目を書き出す方法がわかりません。最大8人ですので、あくまでも人数分表示させたいのです。 1人なら単純にマッチさせて表示させることは出来るのですが、複数人数となると、どういう風にやるのがスマートなのかが思いつきません。 人数分ログファイルを読み込んでマッチさせて表示、を繰り返すのは頭が悪い気がするのです。 お知恵を拝借できれば幸せです。 よろしくお願いします。

みんなの回答

  • maura
  • ベストアンサー率46% (48/104)
回答No.5

<> で区切ったプログラムを考えるより ちゃんとDBにそのデータをいれてロジックを SQLとPerlに分担されるほうがスマートです 無理やりテキスト処理で何とかしようと出来ますが その仕組みを考えるだけの時間が無駄だと思います。 たくさんのよいプログラムが www.cpan.org にありますので 参考にするといいかもしれません。

  • noro6677
  • ベストアンサー率21% (34/158)
回答No.4

>perlを勉強中のものです。 >病院のHPで使う当番表を作ろうと四苦八苦しております。 素人がって事ですよね? 仮にプログラムできたところで素人がつくるプログラム デバック能力の問題・セキュリティー(個人情報やプログラムの不備による乗っ取り)に関する問題と危険です。 素直に外注に出しましょう。

  • leap_day
  • ベストアンサー率60% (338/561)
回答No.3

こんにちは $log(ログファイル***.dat)には『A<>小児科<>7:00-17:00<>』のような感じで20人分書かれていて セレクトボックス8個で当番を選択 その人数分だけ『A 小児科 7:00-17:00』のように表示したい でいいのですよね? どちらかといえば『人数分ログファイルを読み込んでマッチさせて表示』の方のやり方のような気がするけど載せときますね(^^) # 当番選択部 print "<form action='***.cgi' method='post'>\n"; #ファイル名を書いてください $j=1; for(1..8){ print "<select name='name$j'>\n"; print "<option value=''>当番選択</option>\n"; $i=0; for(1..20){ @name=(**,**,**,**); # 先生の名前をリストしてください print "<option value='$name[$i]'>$name[$i]</option>\n"; $i++; } print "</select>\n"; $j++; } print "<input type='submit' value='決定'>\n"; print "</form>\n"; # 当番表示部 $log="****.dat"; # ログファイルを書いてください @data=($in{'name1'},$in{'name2'},$in{'name3'},$in{'name4'},$in{'name5'},$in{'name6'},$in{'name7'},$in{'name8'}); open(IN,"$log"); @name=<IN>; close(IN); print "<table border='1'>\n"; $i=0; for(1..8) { foreach(@name) { ($name,$bunya,$time)=split(/<>/); if($data[$i] eq "$name") { print "<tr><td>$name</td><td>$bunya</td><td>$time</td></tr>\n"; } } $i++; } print "</table>\n"; データとして残しておくのだったらサブルーチンとかでデータの書き込みをして表示部でそのファイルを読み込んでやればいいと思います

  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.2

出力される順序がログファイルの順で良ければ、 while(<LOG>){  # "<氏名><専門科目><受付時間>\n"のような入力を想定  @data=/<([^>]*)>/g;  if($data[0] eq $name1 || ・・・ || $data[0] eq $name8){   print "$data[0] $data[1] $data[2]\n";  } } で充分かと思います。 出力順をname1~8の順にしたければ、やはりハッシュが便利ですね。 while(<LOG>){  @data=/<([^>]*)>/g;  $hsh{$data[0]}=[ @data[1..2] ]; } print "$name1 $hsh{$name1}->[0] $hsh{$name1}->[1]\n"; print "$name2 $hsh{$name2}->[0] $hsh{$name2}->[1]\n"; :

  • tthe_mine
  • ベストアンサー率46% (19/41)
回答No.1

> 人数分ログファイルを読み込んでマッチさせて表示、を繰り返すのは頭が悪い気がするのです。 この方法ですと、ナイーブに考えると (ログファイルのデータ数 * 当番の数) 回だけ比較を行う必要がありますね。確かにスマートとはいえません。 こんなときはハッシュを使いましょう。 ログファイルのデータを名前をキーにしたハッシュに格納します。 一度そうしてしまえば、当番の先生のデータはログファイルの大きさによらず定数時間で求まります。