はじめてのJScript+WSH その9 JScriptで自作関数
はじめに
JScriptの自作関数を作ります。
関数とは
今までの記事でも使ってきましたが、
WScript.echo()やarr.push()など、()があるものが関数です。 ※数学のf(x)と同じ考え方です。
今回はこれを自作するお話です。
引数と返り値
この用語を覚えてください。
数学のy = f(x)でいうと、xが引数、yが返り値です。
下記のコードでは、引数aと引数bを基に、a+bの値を返すaddNumberという関数を作りました。
var addNumber = function(a, b){
return a + b
}
WScript.echo(addNumber(1,3)); // => 4
下記のコードでは引数aと引数bのうち大きい数値を返す関数です。
var compareNumber = function(a, b){
if(a>=b){
return a;
}else{
return b;
}
}
WScript.echo(compareNumber(1,3)); // => 3
下記のコードではreturnをしない関数の例です。
上から読んでいき、1行目~3行目で関数を宣言(ここでは関数は動かない)
7行目で関数を呼び出して、2行目の処理が実行されるイメージです。
var printAddNumber = function(a, b){
WScript.echo(a+b); // => 4
}
var a = 1;
var b = 3;
printAddNumber(a, b);
ファイル入出力
下記の例えはreadFile関数とwriteFile関数を作成しました。
今後「ここは良しなにしてくれる場所」と考えればよいので、
「// テキストを読み込み コメントアウト"!"や空行を無視して出力する」以下の行を修正すればよくなります。
// 変数宣言
var input_filename = "input.txt";
var output_filename = "output.txt";
var input_commands = [];
var output_commands = [];
// ファイル読み込み
var readFile = function(filename){
var arr = []
var fs = new ActiveXObject( "Scripting.FileSystemObject" );
var file = fs.OpenTextFile( filename, 1, true, fileopen_state ); // ファイルを読み取り専用で開く
while( !file.AtEndOfStream ){
arr.push(file.ReadLine());
}
file.Close(); // ファイルを閉じる
fs = null; // オブジェクトを初期化
return arr;
}
// ファイル書き込み
var writeFile = function(arr, filename){
var fileopen_state = 0; // 0:ASCII -1:Unicode -2:SystemDefault
if(arr.length > 0){
var fs = new ActiveXObject( "Scripting.FileSystemObject" );
var file = fs.OpenTextFile( filename, 2, true, fileopen_state ); // 2:新規に書き込み 8:追記
for(var i=0;i<arr.length;i++){
file.WriteLine(arr[i]);
}
file.Close(); // ファイルを閉じる
fs = null; // オブジェクトを解放
}
}
// テキストを読み込み コメントアウト"!"や空行を無視して出力する
// また、EOC (end of command)を見つけたらそこで処理を終わりにする
input_commands = readFile(input_filename);
for(var i = 0; i < input_commands.length; i++){
if(input_commands[i].search(/^!/) > -1) continue; // 先頭が!なら行を無視
if(input_commands[i].replace(/\s/g,"").length == 0) continue; // 空の行を無視
if(input_commands[i].replace(/\s/g,"")=="EOC") break; // EOCを見つけたらforを抜ける
output_commands.push(input_commands[i]);
}
writeFile(output_commands, output_filename);
また、inputファイルとoutputファイルが複数ある場合、ファイル入出力の処理をreadFile()とwriteFile()のみ書けばよくなるため、編集が楽になります。
// 変数宣言
var input_filename_1 = "input_1.txt";
var output_filename_1 = "output_1.txt";
var input_filename_2 = "input_2.txt";
var output_filename_2 = "output_2.txt";
var input_commands = [];
var output_commands = [];
// ファイル読み込み
var readFile = function(filename){
var arr = []
var fs = new ActiveXObject( "Scripting.FileSystemObject" );
var file = fs.OpenTextFile( filename, 1, true, fileopen_state ); // ファイルを読み取り専用で開く
while( !file.AtEndOfStream ){
arr.push(file.ReadLine());
}
file.Close(); // ファイルを閉じる
fs = null; // オブジェクトを初期化
return arr;
}
// ファイル書き込み
var writeFile = function(arr, filename){
var fileopen_state = 0; // 0:ASCII -1:Unicode -2:SystemDefault
if(arr.length > 0){
var fs = new ActiveXObject( "Scripting.FileSystemObject" );
var file = fs.OpenTextFile( filename, 2, true, fileopen_state ); // 2:新規に書き込み 8:追記
for(var i=0;i<arr.length;i++){
file.WriteLine(arr[i]);
}
file.Close(); // ファイルを閉じる
fs = null; // オブジェクトを解放
}
}
// テキストを読み込み コメントアウト"!"や空行を無視して出力する
// また、EOC (end of command)を見つけたらそこで処理を終わりにする
// 1ファイル目の処理
input_commands = readFile(input_filename_1);
for(var i = 0; i < input_commands.length; i++){
if(input_commands[i].search(/^!/) > -1) continue; // 先頭が!なら行を無視
if(input_commands[i].replace(/\s/g,"").length == 0) continue; // 空の行を無視
if(input_commands[i].replace(/\s/g,"")=="EOC") break; // EOCを見つけたらforを抜ける
output_commands.push(input_commands[i]);
}
writeFile(output_commands, output_filename_1);
// 2ファイル目の処理
input_commands = readFile(input_filename_2);
for(var i = 0; i < input_commands.length; i++){
if(input_commands[i].search(/^!/) > -1) continue; // 先頭が!なら行を無視
if(input_commands[i].replace(/\s/g,"").length == 0) continue; // 空の行を無視
if(input_commands[i].replace(/\s/g,"")=="EOC") break; // EOCを見つけたらforを抜ける
output_commands.push(input_commands[i]);
}
writeFile(output_commands, output_filename_2);
次の記事
前の記事
この記事が気に入ったらサポートをしてみませんか?