格子戸を作図します。
動作にはWindowsScriptingHostが必要です。
|
|
AWKなんかだと自動でやってくれるフィールドへの分割も、
VBScript(には限りませんが)では自前で実装する必要があります。
私は C のstrtok()関数をモデルに、(区切り文字の扱いが異なっています)
次のようなものを書いて使っています。
|
|
Function StrTok(Line,Delimiter)
Do While InStr(Line,Delimiter) = 1
Line = Right(Line,Len(Line)-1)
Loop
If InStr(Line,Delimiter) = 0 Then
StrTok = Line
Line = ""
Else
StrTok = Left(Line,InStr(Line,Delimiter)-1)
Line = Right(Line,Len(Line)-InStr(Line,Delimiter))
End If
End Function
|
|
|
VBScriptのプロシージャの引数は、原則参照渡しである事に注意してください。
(プロシージャ内での変更が、呼び出し元に反映される)
値渡しにしたい時は、次のいずれかの手段をとります。
@定義する時に、「ByVal」キーワードを使う
ex.)Function Tako(ByVal V1,V2) ・・・ End Function
A呼び出す時に、引数を ( ) で囲む
ex.)Result = Tako((V1),V2)
StrTok()プロシージャは、Lineの先頭のフィールドを戻り値とします。
例えば、次のような感じで使います。
|
|
Const ForReading = 1
Const LineDataPattern = "^[-0-9]"
Set FSObj = CreateObject("Scripting.FileSystemObject")
Set InputFile = FSObj.OpenTextFile("tmp.txt",ForReading)
Set REObj = new RegExp
REObj.Pattern = LineDataPattern
Do Until InputFile.AtEndOfStream
CurrentLine = LTrim(InputFile.ReadLine)
If REObj.Test(CurrentLine) Then
i = 0
Do Until CurrentLine = ""
X(i) = StrTok(CurrentLine,"")
Y(i) = StrTok(CurrentLine,"")
i = i + 1
Loop
X(1) = CDbl(X(1)) * 2 - CDbl(X(0))
Y(1) = CDbl(Y(1)) * 2 - CDbl(Y(0))
WScript.Echo X(0) & " " & Y(0) & " " & X(1) & " " & Y(1)
Else
WScript.Echo CurrentLine
End If
Loop
InputFile.Close
|
|
|
線分の長さを2倍にするスクリプトです。
CurrentLineは先頭からどんどん削られて、最後は空文字列になるので、
それを利用したループにしています。
(本来は For i = 0 to UBound(X) 〜 Next を使うところですが、例と言う事で)
RegExpオブジェクトに関しては、次の機会に・・・。
|