ここでは、初歩的なデータ検索について説明します。 基本的には、if文で パターンマッチ、数値の比較による検索を説明します。
HTMLのフォーム、データ(またまたスーパーカー)は、Perlの場合と同じとします。
また、フォームからのデータの読み込みは済んでいて、
FmMakerにフォームのMAKERのVALUE、FmEngineにフォームのENGINEのVALUEが入っていて、
クルマのデータは配列LinesCに一行づつ入っているとします。
プログラムの流れは、以下のようになります
これをそのままプログラムにしてみましょう。
1: for LineC in LinesC: 2: [Key, Name, Engine, Power, Speed] = string.split (LineC, '\t') 3: Engine = int(Engine) 4: 5: if FmMaker == "AL" or FmMaker == Key: 6: if (FmEngine == '0' or 7: (FmEngine == '1' and Engine <= 1999) or 8: (FmEngine == '2' and 2000 <= Engine <= 2999) or 9: (FmEngine == '3' and 3000 <= Engine <= 3999) or 10: (FmEngine == '4' and 4000 <= Engine) ): 11: #条件に合った場 12: TLine = '<TR><TD><A HREF="%s">%s</A></TD><TD>' % (MakerName[Key], MakerURL[Key]) + \ 13: '%s</TD><TD>%s</TD><TD>%s</TD><TD><B>%s</B></TD></TR>\n' % (Name, Engine, Power, Speed) 14: Table = Table + TLine
Pythonの場合は「a <x <b」という比較の書き方ができます。 一方、この数値の比較のために、3行目で、Engineを数値型に変換します。 また、フォームのデータを切り分けられた FmEngine は文字型なので、 「FmEngine == '0'」と、クォートで囲って文字型として比較します。
Perl編で説明した、もう少し効率の良い方法は、次のようになります。
1: for LineC in LinesC: 2: if FmMaker == "AL" or FmMaker == LineC[0:2]: 3: [Key, Name, Engine, Power, Speed] = string.split (LineC, '\t') 4: if FmEngine == "0" or FmEngine == Engine[0]: 5: #条件に合った場合 6: TLine = '<TR><TD><A HREF="%s">%s</A></TD><TD>' % (MakerName[Key], MakerURL[Key]) + \ 7: '%s</TD><TD>%s</TD><TD>%s</TD><TD><B>%s</B></TD></TR>\n' % (Name, Engine, Power, Speed) 8: Table = Table + TLine
文字列の一部分だけを取り出すには、「LineC[0:2]」「Engine[0]」という表現で簡単にできます。 今回は、Engineは文字列型のままになります。
CGI全体の例はつくりませんが、検索結果をカウントする場合の注意点で、
Pythonには「i++」という演算はないので「i = i + 1」と書くしかありません。
注意:「i += 1」という書き方は、Python1.5.2ではエラーになりますが、
Python2.0ではうまく出来ます。