« みふでもわかるPHP - 1 | メイン | 書き残しておきたいのでここに記す C++ STL map 連想配列 ネスト »

2005年09月14日

VBSを使ったASP覚書

VBSを使ったASP Perlを使ったCGI

基本事項

拡張子は基本的に .asp

ファイルの先頭に

<%@ Language=VBScript %>

と付け、VBコードは<% %>の間に記述。

コメントは行において ' 以降

変数

宣言
dim a

PHPと同じく型を明示できない(PHPのようにキャストできるかは知らない)。
というより、VBのvariant型(何にでも使える)しかサポートしていないっぽい。
宣言せずに使用できるが、ブロックの頭に"Option Explicit"を記述すると宣言を強要できる。(使用推奨)

配列
dim a(9)
a(1) = 1

動的配列
redim a()

構造体

type foo
mema
memb
memc
end type

dim bar as foo

グローバル変数
public a

静的ローカル変数
static a

基本的に普通かな。

おまけ、定数
const FILE = "file/path.txt"
public const FILES = "A"

演算子

= 代入
+ 加算
- 減算
* 掛け算
/ 割り算
mod 余り
^ 階乗
& 文字列結合

比較演算子

= 等しい
<> 等しくない
> より小さい
>= より小さいか等しい
< より大きい
<= より大きいか等しい
and かつ
or または

代入演算子=と比較演算子=が同一って・・・

is関数

IsArray(変数) 配列か調べる
IsDate(変数) 日付か調べる
IsEmpty(変数) 使われているか調べる
IsNull(変数) NULL 値か調べる
IsNumeric(変数) 数値か調べる
IsObject(変数) オブシェクトか調べる

比較構文

if a = 100 then messagebox "true"

if a = 100 then
messagebox "true"
end if

if a = 100 then
messagebox "true"
elseif a = 120 then
messagebox "120"
else
messagebox "other"
end if

select case a
case 100
msgbox "100"
case 200
msgbox "200"
case else
msgbox "else"
end select

繰り返し構文

for i = 0 to 100
a++
next

for i = 0 to 100 step 2
a += 2
next

do until i = 100
i++
loop

do while i < 100
i++
loop

do until i = 0
i++
if i = 100 then exit do
loop

関数

functionは戻り値がある関数。変数test(関数名)に代入した値が返される

public function test(dim a,dim b)
a = a + b
test = a + b
end function

sub は戻り値が無い関数。

public sub test(dim a,dim b)
a = a + b
end sub

配列を渡すには、引数リストでは()を付けてはいけない。

public function test(dim a, dim b)
a(3) = b(3)
test = a(0) + a(1)
end function

exit function
exit sub

セッション

if isempty(session("data")) then
session("data") = "foo"
end if

PHPと同じように扱える。

Session.Abandon
session_destroy()と同じ

インクルード

<!-- #include file="include/com.asp" -->

よく見たらSSIで見た事のあるアレ。
指定は<% %> 外

エスケープ

chr(13) '改行
chr(0) 'NULL 文字

\nは使えないのかな?

chr(&H22) ダブルコーテション「"」 chr(22)
vbTab タブ chr(9)
vbLf ラインフィード chr(10) , chr(&H0A)
vbCr キャリッジリターン chr(13) , chr(&H0D)
vbCrLf 改行 chr(13) & chr(10)
chr(0) C 言語 NULL 文字
vbNullString C 言語 NULL ポインタ文字列

ASP特有

response.write

JSのdocument.writeと同じ。

このように使うみたい。

<%
response.write("<TABLE><TBODY>")
for i = 1 to 10
response.write("<TR>")
response.write("<TD>" & i & "</TD>")
response.write("</TR>")
next
response.write("</TBODY></TABLE>")
%>

環境変数

ip = request.ServerVariables("REMOTE_ADDR") '** リモート端末の IP アドレス
user = request.ServerVariables("REMOTE_USER") '** リモート端末のユーザ名
url = request.ServerVariables("HTTP_REFERER") '** リモート端末の直前の URL
blws = request.ServerVariables("HTTP_USER_AGENT") '** ブラウザ情報
path = request.ServerVariables("PATH_INFO") '** 現 CGI のパス情報
svph = request.ServerVariables("PATH_TRANSLATED") '** PATH_INFO の物理パス
alhd = request.ServerVariables("ALL_HTTP") '** 送信された HTTP ヘッダ
htlg = request.ServerVariables("HTTP_ACCEPT_LANGUAGE") '** コンテンツの表示に使用する言語
clen = request.ServerVariables("CONTENT_LENGTH") '** コンテンツの長さ
ctyp = request.ServerVariables("CONTENT_TYPE") '** コンテンツのデータ型
scnm = request.ServerVariables("SCRIPT_NAME") '** スクリプトの仮想パス
svr1 = request.ServerVariables("SERVER_NAME") '** サーバ IP、DSN エイリアス、ホスト名
svr2 = request.ServerVariables("SERVER_PORT") '** リクエスト受信ポート番号
svr3 = request.ServerVariables("SERVER_PORT_SECURE") '** 保護ポートでリクエストが処理されたか
svr4 = request.ServerVariables("SERVER_PROTOCOL") '** プロトコル名、リビジョン
svr5 = request.ServerVariables("SERVER_SOFTWARE") '** サーバソフト名、バージョン

GET&POST

para1 = request.querystring("para1")
** http://sak-main/w_test/test.asp?para1=abc の「abc」を取得します。

text1 = request.form("text1")
** 入力フォームの submit になるフォームデータを取得します。

リダイレクト

response.redirect("http://sak-main/w_test/test2.asp?a=123")

PHPといっしょ。HTMLのヘッダに書いて送るのでBODYを書く前じゃないと使えない

学習

VB6と同じように扱えるらしいです。
VBはあんまり好きじゃないんだけどなあ……。

注意

  • 予約語や変数名、関数名に大文字小文字の区別はない
  • 一文一行が原則。よって文末にセミコロンを付けてはいけない
  • True:-1 False:0 そしてTrueは-1の時だけで、それ以外はFalseになる。(C系とは逆)
  • elseif。 else if では無い!
  • switch-caseが全然違うので注意!しかもbreak無しでスルーさせるのも使えない!(勝手にbreakしやがってくださる)
  • for文も全然違うので注意!なんて親切なんだ、死んじゃえ!
  • 関数の引数は標準でアドレス渡し。つまりいくらでも関数内で弄れてしまう。なんてこった!
    • 引数リストの宣言で"ByVal"キーワードを付けたらOK。絶対忘れないようにしよう。というか普通こっちを標準にすべきじゃないの?
  • returnは無い。関数名と同じ名前の変数への代入で代用……何で?

投稿者 miff : 2005年09月14日 15:26



XREAAD