投稿者「Shunsuke Yoshikawa」のアーカイブ

8.3. 外部ファイルをループしていく

8.3.1. ループを考える

外部ファイルの中身をループするには、どこにループを挟むか考えるのが重要です。
何を実現したいかによって、ループを挟む場所を変えていく必要があります。

 

8.3.1.1. 前回マクロの振り返り

ここで、前回マクロを振り返ります。

 

すでに70行にもなっているので、すべての行数を振り返ることはしません。

list.txtというIPアドレスのリストが書かれたテキストを読んで、それをIP_ADDRに代入し、そのアドレスに対してtelnetを行い、ログを取るというものです。

 

8.3.1.2. ループにwhileを使う

今回はループにwhileとendwhileを使っていきます。

whileについて復習しておくと、

の値が1でない限り、あるいは、breakしない限り、endwhileとの間をループするというものでした。

今回はwhileでマクロ全体をはさんでいくことになります。

 

8.3.2. whileをマクロに入れ込む

while文をマクロに組み込むにはその位置を考えることが重要です。

 

8.3.2.1. whileの位置を考える

whileとendwhile、fileopen関連の位置を考えるのは重要です。

なぜなら、挟み込む位置によっては、fileが不用意に閉じられてしまったり、開き直してしまったりするからです。

 

では、細かい途中のマクロを飛ばして、どこに入れるのが適当かを考えてみたいと思います。

そのために、以下のような省略サンプルを使って考えてみたいと思います。

例えば、以下のようにwhile、endwhileを挟むとどうなるでしょうか。

この場合、list.txtを開いて、FHを無効化する動作もループに含めてしまっているので、動きとしては以下のようになります。

ループが開始
fileopenでlist.txtを開く
FHから一行読み込んで、LINEに格納
FHを無効化する
最初に戻る

つまり、endwhileに到達した時にはすでにFHが無効化されているし、最初に戻るたびにlist.txtを開くので、ループのたびにfileopenは初期状態になってしまいます。

これでは毎回一行目しか読み込まれません。

 

では、以下の場合はどうなるでしょうか。

 

fileopenでlist.txtを開く
ループが開始
FHから一行読み込んで、LINEに格納
FHを無効化する
ループに戻る

これだと、ループの一回目でFHが無効化されてしまっているため、二回目の「FHから一行読み込んで」のときにエラーになってしまいます。

ループさせるためには、FHを無効化せずに残しておいてあげなければなりません。

よって、もっとも適当なwhile、endwhileの組み込み方は以下のようになります。

これならば、FHに格納されたlist.txtの上から1行ずつループして読んでいくことが可能です。

 

8.3.2.2. whileの場所

では、実際にマクロの中にwhile、endwhileを組み込んでいきましょう。

 

6-9行目でループを開始しています。
85-88行目でループの最初に戻ります。

これで、list.txtの最初から最後を読んでいくことができるようになりました。

 

しかし、このマクロを続けるとエラーlist.txtの最後に到達した時に、エラーになってしまいます。
それは、リストの最後まで読み込んだあとに、もう文字列がなくなってしまうので、ループを続けられなくなるからです。

次回は、ファイルの最後まで読んだ後、ループを抜けていきたいと思います。
ループを抜けるには、今度はif文を使っていく必要があります。