《エディタを使ってみよう。の2》
となります。
ここで、改造しなければならないのは、batから D* を受け取って、それに応じて日付を計算するようにすることです。
D*を受け取るには・・・と、ここで書いてもよいのですが・・・ここは、ひとつ既存のAWKから取って来る事にしましょう。
一度GEを閉じて、がめらに戻ったら、他のコマンドラインオプションを受け取っていそうなawkをGEで開きます。
で、使用したい部分を反転表示します。(行番号の欄をドラッグ)
で、ブロックのボタンを押して、AWKブロックのベンチが出たら、登録したいカテゴリ・・・
ここでは、tesをWクリックすると、’登録カテゴリ’の部分が、'tesに登録’に変わり、
登録タイトルの下の入力域がフォーカスしますので、そのまま・・・
’オプション判定’とでも入力します。Enterをたたくと、ブロック登録ボタンにフォーカスが移るので、
もう一度Enterで、ブロック用ファイルに登録ができました。
この登録は即時反映しますので、tesをクリック>タイトル欄にオプション判定が出現します。
オプション判定をクリックすると、上のエディットエリアに、内容が表示されます。
確認できたら、GEを閉じて、がめらからtoday.batの編集に戻り、スクリプトボタンで、
スクリプトを表示させてください。
BEGIN{行の行末にキャレット持っていって、Enterを押し(改行し)・・・その後、ブロックボタン>tesカテゴリ>オプション判定 とクリックしていき、
内容を確認したら、オプション判定をWクリックします。
すると・・・nowis()の前に、先程の内容が入力されます。
このように、昔書いたAWKや、今書いているAWKのよく使いそうな言い回しをブロックファイルにしまっておくことができます。
カテゴリの追加はGE本体では行わないので、txteditボタンを押し・・ノートパッドで、awkblc.txtの・・・
/1:サブプログラム
/2:tes
に続けて・・・
/3:カテゴリのタイトル
と、’/’の次に番号 その後に’:’でタイトル という風に空白なしで書いてください。
この際だから、tesを 初期設定関係 とかに直しておいてもよいかもしれません。
まあ、BEGIN節は・・・
BEGIN{
if(ARGC > 2){
for(i=3;i<=ARGC;i++){
if(ARGV[i-1]~/^D/){day_f = substr(ARGV[i-1],2)}
ARGV[i-1]="";
}
}
nowis()
}
こんな感じで、 オプションD*の*の部分の数値をday_f(デイ・フラグ のつもり)に入れておくことにします。
次に関数nowis() ですが、この関数では、関数内にsystime()という特別な変数(現在の時間を保持している)を使っているので、
これを指定した時間で動くように改造しましょう。
その前に・・・これはこれで、他の外部変形で使うことがあるかもしれないので、GEに覚えさせましょう。
Functionボタンを押すと、Functionのベンチが出ます。ベンチの下方右側の関数登録のボタンの下に、
nowis() と出ていると思います。 そのnowis()をクリックし、関数登録ボタンを押すと、
関数登録ダイアログがでますので、そこでカテゴリとタイトルを入力します。
カテゴリはその他 タイトルは 現在時間獲得 とでもしておきましょう。
関数ファイルもカテゴリの追加修正などは、texteditボタンから行ってください。
これで、ほかのAWKを作る際に、簡単にnowis()を使うことができます。
で、nowis()を例えば・・・nowis(siteisitajikan) のような、引数(ひきすう)の付いた関数に改造します。
AWKの変数はどこからでも参照できます。例えば・・BEGIN節の中でxを使っていて、関数の中でもxを使っていると、
どちらからもxを見たり、変更したりできてしまいます。これは、ある意味便利なのですが・・・
BEGIN節で for(i=3;i<=10;i++){ のループ中に関数を呼んで・・・
その関数内でfor(i=3;i<=5;i++){ とかやってると、無限ループになってしまいます。
ですから、関数を書く場合は、その変数などをなるべくユニークな名前にすることを心がけましょう。
そういう意味では、nowis()は見直す必要があるかもしれません。
function nowis(){ の部分を function nowis(siteisitajikan){
とし、now=systime() を now=siteisitajikan; にかえておきます。
で、BEGIN節のnowis()の行を・・・
theday=systime();
if(day_f == 2){theday=theday-60*60*24;}
if(day_f == 3){theday=theday+60*60*24;}
nowis(theday)
のように変更して・・・これで、昨日・今日・明日の日付で書くことができるようになりました。
ここで、1度確認のために、実行してみてください。
どうですか?
後は、指定日の方ですが・・・これは、nowis関数を使わないで・・・現在のEND節内を丸ごと・・・
END{
if (day_f=4){
# 指定日の処理
}else{
# 現在のEND節の中身
}
みたいにするのが、簡単でしょう。
指定日の入力は、拙作のsinputを使えば、悩まずにすむんじゃないかな・・・
ってことで、チャレンジしてみてください。