title1
navigation bar3



[ 1 | 2 | 3 |4 | 5-p1 | 5-p2 | 5-p3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 ] [日経マック連載Index ]


連載[5-2] プロと素人のスクリプトはどこが違うか


《 プログラミングのアイデアは無尽蔵? 》
これでいくらかプロらしくなってきましたね。
先生
まだまだ。では図2と全く同じ機能を持った図3のサブルーチンを見ていただこう。
えぇ〜、これで3つ目ですよ。同じ処理でもプログラミング方法ってのは、いろいろあるもんですねぇ。
先生
今度のはもっと整理されてるでしょ。monthListに月の名前を連ねておいて、それと比較するのはさっきと同じだ。
違うのはmonthNumberListというリスト変数に、"01"〜"12"の文字を入れておくところだ。
何回目の繰り返しで月名が一致したかはtmpNum変数に残っているから、tmpNum番目の項目をmonthNumberListから取り出せば、"May"なら"05"、"November"なら"11"になるはずだね。
こうすれば、1桁の数に"0"を付け足す面倒もない。
図3 エラー処理などを加えた別のサブルーチン
TOP


《 行き詰まったら自発的にエラーを発生して終了 》
ところで先生、このサブルーチンの下から二行目にある  error メッセージ というのは?
先生
おや、もう気がついてしまったか。これが、サブルーチン以外にもう1つ見せておこうかと思っていたワザのヒントなんだ。これはエラーを発生させる命令で、メッセージとして指定した文章がこのように表示されて、スクリプトが終了する。
何を好き好んで、自ら進んでエラーを起こすんですか?
先生
プログラムを実行中に、対応不可能なトラブルが起きた場合は、自ら進んでエラーを発生させて、スクリプトを中止させるのが賢明なこともある。この場合だと、monthListのどの項目とも一致しなかった場合がそれに当たる。
例えば、  my getMonthFromDate("僕の名前は日経太郎") なんてサブルーチンの呼び出し方をしたら、月の数字を得るなんて無理だよね。このほかにも、エラー・チェックの方法はいろいろある。



《 誠に重宝「tryしてダメならon error」構文 》
エラー・チェックと言いますと、やはりif文を使うんでしょうか。
先生
おっ、鋭いですね。もちろんif文はよく使いますが、さっきのようにメッセージを表示させる方法もありますね。
ただし一般的には、
 try
  (試みる処理)
 on error エラー文字列変数 number エラー番号変数
  (エラーが起きた時の対応策)
 end try という構文を使うことが多いね。
先生、どういう意味なんですか、そのtry 云々というのは。
先生
これはね、何かをトライ(try)してうまく行けばいいが、ダメな時、つまりエラーになっちゃった場合なんかだね、その時にはどうするかを on error 以下に書くんだ。
エラーが起きると普通ならメッセージが出て自動的にスクリプトが中止しますけど、そうならないんですか。
先生
中止しないで自動的にon error以下の部分が実行されるという、誠にありがたい命令文なんだよ。
またある意味で、試行錯誤の課程を読者にバラす場所なんです。
だから私はあんまりこのようなスクリプトをあからさまには書きたくないんだがね。
えっ、どうしてですか?
先生
詳しく書けば書くほど、私の知能程度がバレてしまうじゃないか。だからここでも、ほんのサワリだけにしておこう。
TOP


《 コピー先に同名ファイルがあってもノーエラー 》
実際には、どのように使うのですか。
先生
例えば前回登場したスクリプトで、フォルダ内のすべてのファイルを別のフォルダに移すスクリプトがあったね。
ファイルをコピーする時に、何らかの手違いで既にコピー先のフォルダに同じ名前のファイルがあったらどうなちゃうんだい。エラーになってスクリプトが途中で止まってしまう。こういった場合に、try〜on errorが役に立つんだ。
図4のように書いてみたんだが、分かるかな。
図4 try構文でエラー処理を行う例
前回は、aLocalFolderという変数で指定したフォルダの中にあるすべてのファイルを、aServerFolderで指定したフォルダにコピーしたんですわね。繰り返しの方法が前回と違いますね。
先生
今回は、

 repeat until 条件
  (繰り返す内容)
 end repeat

という構文を使ってみた。これは「条件が成立していない間」だけ繰り返すんです。まぁそれはいいとして、繰り返しの中に、try〜end tryがあるよね。さてこれはどういう意味でしょう?

tryの直後の  move item countFile of aLocalFolder to aServerFolder   は、aLocalFolder内のcountFile番目の項目(ファイル)をaServerFolderへ移動(異なるボリュームの場合はコピー)するものですね。
先生
だがさっきも言ったように、何かの手違いで既に同じ名前のファイルがaServerFolderにあるかも知れない。
はい。
先生
そんなことがあってスクリプトが停止してはまずいんで、対応策をon error〜end tryの部分に用意しているんだ。
エラーが生じるとon errorの部分に飛んで、その時はエラー文字列とエラー番号がAppleScriptのシステムから渡される。図4では、エラー番号が「-15267」(既に同じファイル名がある場合のエラー番号)だったら、同名のファイルをaServerFolderからdeleteしてしまえ、というわけだ。その上で改めてmoveする。こうしておけば処理は停止しないで連続して動いてくれるんだ。
AppleScriptって簡単だと思ったんですが、奥が深いんですね。
先生
スクリプト言語にしろ何にしろ、高級化すればするほど、アセンブラの時代とはまた違ったテクニックがいろいろと生まれてきますから、その辺が逆に面白いとも言えるんじゃないでしょうかね。

TOP

AppleScript救急隊事務局(ASQs) info-asqs@fsight.co.jp

主催 株式会社フォーサイト   後援 アップルコンピュータ株式会社

(c)1996-2010 The ForeSight Inc. All rights reserved.Appleは、米国アップルコンピュータ社の登録商標です。
AppleScriptは、米国アップルコンピュータ社の商標です。
その他記載の会社名・製品名・ソフトウェア名は一般にその会社の登録商標または商標です。