では、プログラマーからみたとき、インタープリタ言語 とそうでないものの最大の違いは何か。筆者は eval があ るかどうかだと思っている。 eval とは、、 evaluate" の略 で、文字どおり、、評価する〃という意味である。プログラ ムの評価とは、それを実行することだ。評価したときの副 作用によって、端末に文字を表示したり、計算をすること ができる。しかし、機械語を実行することを、、評価するク とはいわない。 Perl の eval オペレータも、例にもれす Perl のプログ ラムを受け取ってそれを評価する。たとえば、 eval 'print ” e110 \ が というプログラムを実行すると、 he110 という出力か得られる。 print "hello\n" と書いてもまったく同しだが、後者は最初のコンパイル時 に構文が解釈されるのに対し、前者はたんなる文字列とし て保持される。そして、実行時にはしめて print 'hello\n' という文字列が解釈されるのである。 この eval の機構は、さまざまなことに応用できる。 ( 1 ) die if @ARGV く 2 ; $TARGET = pop (@ARGV) ; open(TARGET) Ⅱ die "$target : vhile ( く TARGET>) { for $word (@ARGV) { if (/$word/) { print ; next ; eva による高速化 # 最後の引数がファイル # 単語がみつかったら表示する ファイルのなかから、複数の文字列のうちのいすれかを 含む行を表示するプログラムを考えてみる。 grep コマン ドでは 1 つのパターンしか指定できないので、こういう場 合は困ってしまう。 使い方はできるだけ単純にして、検索する単語を列挙し、 最後に検索対象のファイルを指定することにする。 1 つの パターンと複数のファイルを指定する grep とちょうど逆 になる。とりあえす、コマンド名は ngrep にしておく。 たとえば、 % ngrep f00 bar baz target—file と実行すると、 target-file というファイルのなかで { 00 、 bar 、 baz のいすれかの文字列を含んでいる行を表示する。 検索する文字列がファイルに入っているときには、シェル ( バッククオート ) を使って展開すればよい。 の、、 ( 1 ) は、この ngrep を実現するプログラムである。 @ARGV の最後の要素が示すファイルから 1 行すっ読み 込み、残りの@ARGV のループでどのパターンが含まれて いるかを検査している。 /usr/dict/words から 2 , 000 行抜き出して、それに対し て 30 個の文字列を検索するのに要した時間を次に示す。 33.5 real 32.8 user 0.2 sys すいぶん時間がかかっているが、しつはこのプログラム には大きな欠陥がある。 ( 2 ) die if @ARGV く 2 ; $TARGET = pop (@ARGV) ; $pattern = join( ' P , @ARGV) ; open(TARGET) Ⅱ die ile ( く TARGET>) { if (/$pattern/o) { 162 "$target : # 最後の引数がファイル $ ハ n ” # 単語がみつかったら表示する UNIX MAGAZINE 1993.10
CDROM 通販カタログ #CD ー 33 S ー 20 MSDOS CDROM V をれ A 〃ノ 993 6 , 500 * この Simtel には、約 500 Ⅷのディスクの中に 8 , 500 以上もの MSDOS のファイルが詰 め込まれています。その数々のファイルの例をあげれば、まず、多くの熟練し たプログラマに配布されているソースコード ( 普通は C) が付属しています。テ クニカルマニュアル、ユーティリティが入っており、また開発ツールとして、 APL 、アセンプラ、 basic 、 C 、 C + + 、 Clipper 、 DBase 、 Forth 、 Lotus123 、 Modula2 、 PascaI,PerI 、 Pr010g 、 SmaIltalk 、 Xlisp などが用意されています。その他に、イ ンクルードッール、通信のユーティリティ (CMU の PC/IP 、 kermit 、 uucp 、 zmodem など ) が入っています。 BBS 用のユーティリティなども完備しています。 デモも数多く入っていますが、何といっても ' 92 年の世界 PC ソフト・デモ選で優 勝した、あの UNREAL が収められてあります。あらゆる人々の絶賛を集めた、 20 z ステレオ上映可能、上映時間 16 分以上、圧縮をかけて 1.44 Ⅷぎりぎり、と いう凝りに凝りまくったサウンドと画像を思う存分お楽しみください。 ′ CD -34 CICA MS Ⅳ加面脚 CDROM V . A れ 7993 跖 , 500 * インディアナ大学で収録された、合計 140 Ⅷ以上の CICA Windows 用プログラムが 収めてあり、シェル、アプリケーション、各種ユーティリティ、ゲーム等が入 っています。 Windows のデモプログラム、数多くのプリンタ・ビデオドライバもつ いています。ポストスクリプト、 A 、トウルータイプ・フォントを含めた多くの フォントも完備。ソースのリストや、 C 、 C + + 、 To 引 book 、 Tu rboPasca I 、 Vi suaIBas i c のプログラミング・ユーティリテイも収められています。 #CD - 70 .ICSM Shareware Co 〃“伽 Ve れノ住ッ 7993 5 , 500 * 米国の 589 名の著作者から寄せられた 1531 本のシェアウェアが含まれ、 BBS システム、通信、データベース、各種ドライバー、フォント、各種ゲー ム、グラフィック、アイコン、医学、音楽、開発、科学、スポーツ、各種ユー ティリティ、ワープロ等 49 ジャンルに分類されたシェアウェアを 400MB 以上収録してあります。 #CD-71 GRAPHICS(I) CDROM V にれ ec ノ 992 5 , 000 * 16 , 000 以上のファイルが合計 426MB 収録されたこの CD は全ディレクトリ だけで 751 , 141byte になります。 lnternet の comp. graphic's news groupe resource ー list の 95 % 以上を含みます。アニメーション、ファイル コンバート、描画、フラクタル、ペイント、プロット、レイトレーシング、 ビューアー、圧縮 (JPEG 、 GIF) 、レンダリング、モデリング、写真編集、プ レゼンテーション等。これらアプリケーションの中にはソースコードの付 属しているものも多くューザの必要に応じてカスタマイズが可能です。対 応機種は AMIGA ・ ATARI ・ Macintosh ・ MS-DOS ・ MS-Windows ・ NeXT ・ SGI ・ UNIX ・ SUN と多岐に渡り、異機種間でのデータコンバートにも力を 発揮します。サンプルデータも多数収録。 #CD-72 AUDIO(I) CDROM V にれおにみ .1993 V5. , 000 * 合計 440MB 、 10 , 000 以上のファイルを収録。サウンド ( 工フェクト、フ ォーマットコンバーター、エデイタ、ジェネレータ ) 、 DSP 、ミュージック ェデイタ、等、 1 , 000 以上のオーディオアプリケーションおよびサンプ ラー、歌、プレイヤー、スピーチ、トラッカー等の数百の MOD ファイルが 収録されています。ソースコードの付属しているものも多くューザの必要 に応じてカスタマイズが可能です。対応機種は AMIGA ・ ATARI ・ Macintosh ・ MS-DOS ・ MS-Windows ・ NeXT ・ SGI ・ UNIX ・ SUN です。 #CD-73 MULTIMEDIA CDROM V れノ“雇 1993 9 , 500 * 音響効果 1 , 232 、 MOD 214 、画像 1 , 044 、書籍 179 、動画 100 、ハイバー カードアプリ 114 、プログラム 608 を収録。合計で 625MB 、 13 , 000 以上の ファイルになります。アプリケーションの中にはソースコードの付属して いるものも多くユーザの必要に応じてカスタマイズが可能です。対応機種 は AMIGA ・ ATARI ・ Macintosh ・ MS-DOS ・ MS-Windows ・ NeXT ・ SGI ・ UN Ⅸ・ SUN と多岐に渡り、異機種間でのデータコンバートにも力を発揮し ます。この CD にも多数のサンプルデータが収録されています。 #CD-74 MEGA M. " 卩 ) CDROM V にれ J “れ 1993 7 , 500 動物、宇宙、旅行、自然、街、恐竜、等をテーマに関連付けられたデジタル ファイル ( 音声、音楽、グラフィック、ビデオ等 ) を多数収録。マルチメディ アプレゼンテーションの作成、実習、商業用アプリケーション用に最適で す。画像は 24bitJPEG 、音声は 8 & 16bit の AIFF 、 WAV 、 SND 、 AU と高 品質で収録。ビデオも MPEG 、 AVI 、 QUICKTNE の各種フォーマットで 収録してます。 Save Money ! Save Time ! Don't Wait Order Now ! 株式会社ビレッジセンター通信販売部 TEL 0424 ー 88 ー 8428 FAX 0424 ー 88 ー 5471 #CD ー 35 XI 秋 5 & GNU CDROM 材 . D .7992 4 , 000 XI 1R5 W i ndows Sys t em のパッチレベル 17 までの全ソースが含まれており、 Usene t comp から配布されたソフトのほとんどを網羅し、 GNU Emacs 、 GNU Co 叩Ⅱ er を代表とする G 用フリーウェアのソースコードも同梱されています。 配布されたソースコードの中には、 SP C の実行ファイル、そして GNU プログラム のライプラリイ、 XI 1R55 等が含まれており、もしあなたがスパーク・ステーショ ンかその互換機をもっているのなら、何も作らなくても XI 1R5 、 GNU プログラムを 走らせることが可能です。 CD に含まれる 120 以上の GNU プログラムを挙げると、 GNU Emacs 、 ghostscript 、 onscreen 、 Postscript 、 previewer 、 Gawk programming Languege 、 GNU Assembler 、 BISON parser 、 GDB symbolic debugger 、 small talk 、 interpreters 等です。全て のプログラムは Un ⅸ上でもコンパイル・実行が可能です。 #CD ー 37 So 肝朝 CDROM V にれ M 「ノ 992 Y14 , 000 * SimteI-20 、 Unix-C など、多くの MS 開 S のソースコードがディスクに収められてい ます。トータルでは 600MB の容量を持ち、 15 , 000 以上のソースが入っています。 またインデックスによって、ファイル名やジャンル等から格納位置を検索する ことが可能です。 Usenet の 11 , 000 近くのファイルが 39MB の容量に入っており、 Amiga 、 APPle2 、 Atari-ST 、 Mac 、 Sun 、 Unix 、など各機種用に alt/co 叩ソースが用意さ れています。そして、 Simtel ー 20 Unix-C Archive の、 1 , 000 もの C ソースファイル が 130 Ⅷの容量で入っており、ほば全てのジャンルを網羅しています。 MS 開 S 用は 73 で、 zip で圧縮された 2 , 000 のソースが入っています。ソースの多くは、 C に よって書かれていますが、 Pascal (TurboPascal) 、 basic 、アセンプラ、 Lisp 、 C + + 、 Mod ⅲ a ー 2 、 Fortran 、 Awk 、 Forth などでも書かれています。 # CD ー 38 〃 0 励 OS / 2 CDROM V 催 . ノ“″ノ 993 仇 000 * NEW lnternet の hobbes. nmsu. edu から、 2 , 772 本の OS / 2 用プログラムが 600MB 以上収 録されており、アーカイプ・圧縮ユーティリティ、モデムユーティリティ、通信、 ディスクユーティリティ等の他に、ビデオ、プリンタ、キーポードの各ドライ バも入っています。 DTP やエデイタ、ワープロまで入っています。そして、使用 のための説明書やテクニカルドキュメントがついています。 # CD ー 39 片 e Time 柞ル 4 「 UNIX2 ー 2 CDROM V をれ A g ノ 993 Ⅵ 5 , 000 フリーの UNIX 関連ソースコードとドキュメント 3 , 000 Ⅷ以上が圧縮されて ISO- 9660 フォーマットの CD-ROM に収録されています。また使用方法、パッケージリ スト、キーワードによる索引が英文 96 ページの本になっています。このフリー ウェアは世界中のコンピュータ技術者の努力の集大成です。 PTF はインターネッ トから興味深いソフトの最新版を探しだし、注釈をつけて整理しました。そし て便利で無駄のない形式で皆さんに提供します。この版では 100 以上のインター プリタ、数十のソフトウェア開発キットを含んでいます。またテキスト処理 ツール、グラフィック &GUI ツール、算術処理、ウインドウューティリティ、そ の他多くのツールを収録しています。多くのプログラマにとって使用したいソ フトの最新版を探すことは不可能もしくは避けたいところですが、 P はこの問 題を解決します。 #CD ー 40 AB20 Å川な 2 CDROM V にれ M 住歩 7992 Ⅵ 0 , 000 * このディスクには、 ab20.larc ・ nasa. gov からの計 300 Ⅷ以上のソフト、総計 3 , 000 以上のファイルからなる Amiga lnternet Archive が収められています。数百も のソフトには、 G のユーティリティ、エデイタ、ハイバーテキスト、プロット 用ユーティリティ、モデム・通信プログラム等が見つかる事でしよう。デモ CM 、 各種のゲームも入っています。多くのグラフィックイメージ、アニメーション、 そしてビューワーも当然入っています。 ( この CD は igaCD ー科では動きません ) #CD-41 0 MSDOS/Mac CDROM V にれ . 住 ) , 7992 10 , 000 * このディスクにはフィンランドの Vasa 大学内、 Garbo Archi ve から選りすぐり の、約 250 Ⅷの MS 開 S のソフトと約 125 Ⅷの Macintosh のプログラムが入っており、 イギリス産の殆ど全てのプログラムをカバーしています。 #CD ー 42 C ' s G 叩〃み ra CDROM れ仇ロ 992 5 , 側 0 米国 C User' s Gro 叩のユーザーサポートより、 C のソースコードのコレクション をお送りいたします。ほとんど大半のコードは MSDOS 用ですが、幾つかのポリ ュームは、 UNIX とその他のシステム用のコードとなっています。若いポリュー ムの幾つかには、 CP/M 用のソースコードが多数入っています。ポリュームは 100 から 364 まであり、ソースコードは、エデイタ、逆アセンプラ、コンパイラ、イ ンタープリタ、通信、 BBS 、ゲーム、教育、数学のライプラリなどです。 # CD ー 43 加ー M 側 CDROM V 催 . A g ノ 992 2 , 00 ″ * 全 4 , 000 以上の Macintosh 用のプログラムが、 1 枚の CD に入っています。例えば、 デスクアクセサリ、ゲーム、ウイルス防止プログラム、デモンストレーション CM などです。更にこのディスクにはグラフィック、サウンド、ハイバーカードス タックなどがぎっしりと詰め込まれています。 より高度なものを求めたい方も、ソースコードのサンプル、完全なリストだけ でなく、ドキュメントや詳細な解説も付いているので、思う存分堪能すること が出来るでしよう。このディスクは S Mac フォーマットです。 NE ル ・上記掲載の価格には、消費税は含まれておりません。また、それぞれ別途に送料 + 手数料が¥ 1 , 000 かかります。 商品の内容はバージョンアップ等に伴い、予告無く変更される場合がございます。御了承下さい。
◆立〃 SOlaris への 旅立ちをサポートします 教育サービスのごあんない 日本サン・マイクロシステムズ株式会社の教育コースは、 米国 Sun Microsystems, lnc. で開発されたコーステキストを べースに、日本のユーザ向けに内容を組み替えた、独自の カリキュラムにそって学習を進めます。 弊社教育コースでは、 SPARCstation を用いた豊富な実習を 通じて、実践的な知識を修得できます。 SoIaris 2. x 対応コース また、自習用教材や、お客様だけの特別コースの設定、 Sun の教育プログラムをお客様が開設できるライセンストレー ニンク喫約など、標準コース以外のメニューも設けています。 新たに SoI s2. x 対応のエンドユーザ、プログラマー、シス テム管理者向けのコースフローも開催し、みなさまのお越 しをお待ちしています。 OpenWindows オペレーション I OpenWindows オペレーションⅡ コマンドオペレーション入門 Solaris 2. x プログラマのための基礎 ANSI C プログラミング I ANSI C プログラミング II システムコー丿レプログラミング SunOS 4. x 対応コース Motif プログラミング XView プログラミング I XView プログラミング II SoIaris 2. x ネットワークプログラミング SoIaris 2. x マルチスレッドプログラミング オプジェクト指向システム開発入門 オプジェクト指向分析 C 言語プログラミング ステップアップのための基礎知識 オフジェクト指向設計 Solaris 2. x システム管理 basic SoIaris 2. x システム管理 I SoIaris 2. x インストール Sun0S 4. x to S01aris 2. x システム管理 SunOS 4. x プログラマ向け Solaris 2. x プログラミンク環境 ワークステーション管理 ( Sun0S 4 」 . x ) SunOS ( 4 」 . x) インストール SunOS オペレーション入門 I Sun0S オペレーション入門Ⅱ シェルプログラミング お問い合わせ 詳しい資料を希望される方は、資料請求カードをご利用ください。 教育コースカタログを送付いたします。 日本サン・マイクロシステムス株式会社 A Sun Mi crosystems Computer Corporation Business KSP トレーニングセンター TEL044 ー 819 ー 3181 川崎市高津区坂戸 3 ー 2 一 1 KSP 西棟 413 号 FAX044 ー 819 ー 3180 Sun Microsystems 、 Sun Microsystems 社のロゴ・マーク、 XView は米国 Sun Microsystems,Inc. の商標です S 司 aris は米国における米国 Sun Microsystems 社の登録商標ですは日本サン・マイクロシステムズ株式会社の商標 です。 Motif は ()pen Software Foundation,Inc. の商標です 資料請求 N 。 .85
DZ—X 流プログラミング このようなときにも、編集前のプログラムを保存してお けばすぐに以前の状態に戻せます。また、編集後のプロ グラムを前のものと上交すれば、どんな誤りを犯してい るかも調べられるでしよう。つまり、プログラムを編集 するときには、以前のバージョン 1 を保存しておくこと が重要となるわけです。 このためにはすべてのバージョンをコピーしておく 方法が考えられますが、それぞれのバージョンとファ イル名の対応の管理や各バージョンがどんなものかの 記録が必要となります。たとえば、、、機能 A は実現し たか機能 B の実現に着手する前のバージョン " を見た いと思ったときに、実際にどのバージョン ( ファイル ) を見ればよいかは、これらの記録がないと判断できま せん。また、 1 人でプログラムの開発を進める場合は問 題となりませんが、複数の人間か携わっていると、、誰 がいつ " 編集したかが重要になります。さらに、複 数の人間が同じファイルを編集してしまう可能性もあ ります ( 通常は、どちらかの変更が無効となります ) 。 このような問題に対処するためのシステムがバージ ョン管理システムです。これを用いれは、 任意のバージョンの取出し 三 , 、一 , 000 000 = 00000 00000 バージョンに対してロック機構を設けて複数の人間 が同しファイルを編集しないようにする などがおこなえます。 UNIX 上のバージョン管理システムとしてよく利用 されるものに SCCS と RCS があります。 SCCS は SystemV 系の OS には通常デフォルトで付いています し、 SystemV R4 ではプログラム開発のノヾッケージに 含まれているようです。一方 RCS は、ソースコードが フリー・ソフトウェア (GNU のソフトウェア ) とし て配布されており、ほとんどの UN Ⅸシステムで利用 できます。どちらのシステムもよく似た機能を提供して いますが、 RCS のほうがより多くの人に使われている ようなので、 こでは RCS をとりあげます ( ただし、 RCS 多くのマシンに RCS がインストールされていればの話 ですが・ プログラムを改良しようとしてソースファイルの編 集をすると、誤ってバグを埋め込んでしまったり、ひど 1 通常、プログラム開発を進めるときのそれぞれのプログラムのことを いときにはプログラムが動かなくなることもあります。 バージョンと呼びます。 36 今泉貴史 前回までは lint をとりあげていましたが、これはデ バッグに便利なツールの紹介ということで始めたもの でした。デバッグの話を始めたのはいつかと調べてみた ら 1992 年の 9 月号、 1 年以上もデバッグについて説明 してきたのですね。長かったデバッグの話も終り、今回 からは新しい話題です。前回約束した RCS(Revision Control System) をとりあげます。 149 UNIX MAGAZINE 1993.10
3 は光学性のものも、トラックポール付きのものもお気 に入りのようです。おせんべいをかしるかのようにガリガ リとかじったり、床に投げつけたりして遊んでいます。光 学マウスの怪しく光る赤いランプを飽きるまで見入った り、トラックポールのポールをくるくるいじって遊ぶこ ともあります。もう 1 つ好きなのは、マウスとキーポー ドを結ぶケープルです。紐は引っ張るものと学習したの でしようか ? 床に投げつけたマウスのケープルを喜んで 引っ張りながらはいはいするので、キーポードまでか床に 転け落ちるといった状況に至ってしまいます ( あー、や キーポードを叩く遊びも大好きです。シェルの状態で 叩かれるのは若千不安なので、 cat コマンドなどを実行し てから触らせるようにしています。バッフアがいつばい になってベルか鴫ると、よりいっそうハイな状態に陥っ ていきます。 ところで、彼の小指を CTRL キーの上に置き、目い つばい手を拡げると人さし指がようやく D のキーにたど り着くことが分かりました。なせそんなことさせるのかっ て ? いやあ、 - 早期から CTRL 十 key に慣れさせておこ 。あなたのお子様は、どこまで届きます うと思って・ か ? そのうち、 誰か : 宅の子どもは F まで届くようになりましたワ 文 : あら、うちの子はもう G に届きますのよ。ホホホ なんて自慢ができるようになると嬉しいナ ( 冗談です ) 。 位置パラメータ 先月から Bourne シェルのパラメータ ( 変数 ) につい て紹介していますが、今回はパラメータの一種である、、位 置パラメータ " について勉強しましよう。 UNIX のコマンドを実行するとき、 ls ー 1 * . tex や、 Vi filename のように引数を使うことがよくあります。これと同しよ うに、シェル・プログラムの実行時にも引数を指定できま UNIX MAGAZINE 1993.10 IJN Ⅸへの招待 す。たとえば、 shellprog という名前のシェル・プログ ラムがあるとしましよう。その実行時には、 % shellprog option filename などと引数カ甘旨定できるわけです。 UNIX ではコマンドに対して指定した引数は、 ( シェル を通して ) かならすそのコマンドに渡されます。この例 では、引数 option と filename がシェル・プログラム shellprog に渡されます。そして、渡されたこれらの引数 は、 (Bourne シェル・プログラムの場合 ) Bourne シェ ルのパラメータである、、位置パラメータ " の値として保存 されます (C シェル・プログラムの場合は、シェル変数 argv の値として保存されます ) 。 位置パラメータの値の参照 実行時に引数を指定し、それがシェル・プログラムに 渡されても、プログラム中で使用されなければまったく意 味がありません。そこで次に、位置パラメータの利用去 について勉強しましよう。プログラム中で位置パラメー タの値を利用するには、 $ れ社 77 ~ と記述します。メタキャラクタ $ に続いて指定するれれ m では、位置パラメータの何番目の値であるか、すなわち引 数の何番目かを数字で指定します。たとえば、 1 番目の引 $ 3 数を指定するには、 3 番目の引数なら、次のように指定します。 169 echo コマンド名は $ 0 です。 # ! /bin/sh % cat example う例を見てみましよう。 では、プログラム中で位置パラメータの値 ( 引数 ) を使 名 ) が参照できます。 9 は引数が、 0 はシェル・プログラムの名前 ( コマンド れ社 m には、 0 ~ 9 までの数字しか使用できません。 1 ~
vhiie (print('> , ) , $ eval {print "fib ( $ & ) の print 文が eval のプロックのなかに入っている。 ( 1 ) のプログラムをよく見ると、計算結果を表示するため setjmp/longjmp 、 Perl では eval/die である。 いう状況はよくある。これを解決する方法が、 C ならば しまう。プログラムが死んでは困るが、処理はやめたいと したくても、 C を入力するとプログラム自体が終了して するといつまで待っても出力が返ってこない。処理を中断 どのくらいの計算量か知らすに、いきなり 100 などと入力 関数を実行した結果を表示するプログラムである。これが ( 1 ) は、ユーザーが入力した数値に対して、フィポナッチ 直したい、というような場合に便利だ ったとき、いままでのことは全部無効にして最初からやり 掛けである。プログラムの実行中に例タ勺なエラーか起こ など無視してあとでその場所にいきなりジャンプする仕 の実行コンテキストを保存しておいて、関数呼出しの階層 setjmp/longjmp というのは、プログラムのある時点で ニズムが実現できる。 perl では eval/die を使ってこれと同等の大域脱出のメカ C の setjmp/longjmp をご存しなら話が早いのだが、 に大きな数字を指定すると、この print 文のなかの &fib ( $ & ) のところでかなりの時間がとられる。この最中に端末 から C を入力すると、さきほど説明したように SIGINT に対するシグナルハンドラか呼び出される。そこでは、 die “ lnterrupted\n" ・ というように lnterrupted というメッセージを残してお 亡くなりになっている。ここで、 eval の最中に致命的な工 ラーカ起きても、プログラムは終了しないことを思い出し ていただきたい。これは die に対しても適用さ eval の なかで die が呼ばれると、それ以降の処理をやめて eval の呼出しが undef を返すのである。そのときの die の引 数、ここでは lnterrupted という文字列が、 eval か了し たあと $@ という変数にセットされる。 つまり、計算中に SIGINT がくると、その計算を中止し て次のプロンプトを出し、ユーサーの入力を促してくれる のである。これで安じ、してどんな数字でも入力することが できる ( もっとも、この例だとメモリが足りなくなって死ん でしまう可能性が高いが ) 。 ev の結果による置換 x (length($&) * 8 ー &length($') % 8)/e; 1 while s/\t + /, ② ( 1 ) # 日本語文字列の表示上の幅を返す sub length { return(length($- [ 0 ] ) ) unless $ ー [ 0 ] 10Ca1 ( $ ー ) = shift ; s / \ 033 \ $ C\@B] ハ 033 \ ( [JB] //g; 1 ength ; # 非表示可能文字を処理する while ( く > ) { ~ / \ 033 / ; s/ [ \ 200 ー \ 377 ] /'M-' . pack('c' , 。て d ( $ & ) & 0177 ) / ge ; s/ [ \ 000 ー \ 011 \ 013 ー \ 037 ] / ' . pack('c' ,ord($&)10100 ) / ge ; print ; s / \ 0177 た ? / g ; 以前に述べたように、文字列を置換するには、 sed と同様 166 s/pattern/replacement/ という構文を使用する。 s / / / では最後にオプションの指定 ができるが、 e というオプションの説明はしなかった。 通常は、加川にマッチした部分がゆ / 〃化襯 e 厩に置 き換えられるだけだが、最後に e オプションを指定する UNIX MAGAZINE 1993.10
LittIe perl pa 0 「の print ; next ; @ARGV に入っている要素を一でつないで 1 つのパタ ( 1 ) のプログラムの実行が遅かった最大の原因は、正規表 現のコンパイルに時間をとられたためだ。文字列の検索を、 ーンにしている。 f00 、 bar 、 baz という値カ甘旨定されてい たら、検索するパターンは、 if (/$word/) { f00 ー bar ー baz のようにおこなっているが、この部分を実行するたびに となる。今度はこのパターンだけを検索すればいいので、 $ w 。 rd のなかに入っている正規表現を再コンパイルしな ければならない。毎回コンパイルするのを防ぐには、 if (/$pattern/o) { /$word/o のように。オプションを指定することができる。 ( 2 ) を ( 1 ) と 同じ条件で実行した結果を次に示す。 のように。というオプションを付けて、最初の 1 回だけコ ンパイルするように指定する方法がある。しかし ( 1 ) の場合 2.3 real 1 .7 user 0.0 sys には、ループのなかで $ word の値が変わっているので、 0 ( 1 ) にくらべて 10 倍以上高速に処理されている。正規表 オプションは指定できない。 現のコンバイルがいかに処理を遅くするか分かっていた 逆に、正規表現文字列の値が変わらなければ。オプシ だけただろう。 ョンを指定できる。そこで、すべての文字列を 1 つのパタ ーンで検索するようにしたのが、 ( 2 ) のプログラムである。 ( 3 ) die if @ARGV く 2 ; $TARGET = pop (@ARGV) ; # 最後の引数がファイル foreach (@ARGV) { # ループの中身を作る (print) , next if /$-/;\n" $prog ・ = open(TARGET) Ⅱ die "$target: $ ! \n" eval "while ( く TARGET>) {\n$prog}\n" # eval で実行する print $@ if $ # 工ラーをチェック のほうが効率がよいことを意味する。 したがって、次のよ さて前置きが長くなったが、いよいよ今回の主役、 eval うなプログラムを作ればよい。 の登場だ。 ( 2 ) のプログラムは ( 1 ) にくらべればはるかにましだが、ま vhile ( く TARGET>) { (print) , next if / f00 / ; だ改善の余地が残されている。ここで次のことを憶えてお (print) , next if /bar/ ; いてはしい。 (print) , next if /baz/ ; 複雑な正規表現 1 つですませるよりも、単純な正規表現を もちろん、こういうプログラムが必要になったときに検 組み合わせたほうが効率的である。 索文字列に合わせて作ればいいのだが、それではあまりに 芸がない。それよりは実行時にプログラムを作って、それ これは、 を実行できればいいのではないかということで eval の出 番がやってくる。 ( 3 ) の例では、 @ARGV の内容から、 if (/foolbarlbaz/) {. よりも、 next if / f00 / ; (print) , next if /bar/ ; (print) , next if /baz/ ; (print) , 0 0 163 UNIX MAGAZINE 1993.10
LJN Ⅸへの招待⑩ プログラムの場合にはとくに問題になりませんが、引数 test 式 の値が必顔であるプログラムの場合はちょっと問題です。 ューサーが、誤って引数を指定し忘れることだってなき test は、式で指定された条件式の詔面結果が真であれ にしもあらすです。このような問題を回避するには、プ は 0 を、偽であれば 0 以外の値を返します。式にはさま ログラム中で引数の有無や数をチェックし、誤りがあれは ざまな条件式カ甘旨定できるのですが、こでは直を調査 工ラーメッセージを出してプログラムを停止するなどの する牛式だけをとりあげることにします ( それ以タ ) 条 処置を講しておかなけれはなりません。 件式については、稿を改めて紹介します ) 。これには、以 UNIX コマンドのなかには引数の指定を忘れたりその 下のものがあります。 数を誤ったりした場合に、それを知らせるエラーメッセー れ社 rn プ -eq れ社 m2 : ジを出し、コマンドか終了するものがあります。 れ m プとれ社 m2 か数 f 勺に等しいとき真 れ社 7 れプ -ne れ社〃 ~ 2 : % cp file Usage: cp [—ip] fl f2; or: れ社 rn プとれ社 m2 か数イ勺に等しくないとき真 cp [-ipr] fl fn d2 れ社 m プ -gt れ社 m2 : れ社 m ノがれ社 m2 より大きいとき真 れ社 m プ -ge れ社 m2 : れ社 m プが num2 以 - E であれば真 れ m ノー仕れ社 m2 : れ社 m ノがれ社 m2 より小さければ真 れれ ml ーれ社 m2 : numl がれ社 m2 以下であれば真 たとえば、位置パラメータの数 $ # が 0 に等しいかどう かを謌・ヾるには、 test $ # —eq 0 2 より小さいかどうかを調べるには、 test $ # —lt 2 と使います。 if コマンド test の使い方を踏まえて、次に if コマンドを勉強しま しよう。 Bourne シェルの if コマンドは、次のような形 式で使います。 こ刎列は、 1993 年 8 月号に登場したものです ( そのと きは、 > & 2 でエラーメッセージを標準工ラー出力に出力 if 〇 comma れ d then 〇 cornmand こで使用してい する例として示しました ) 。以降では、 る test と if の言岩田を見ていきます。 elif 〇 command test コマンド test コマンドは、次のように使います。 UNIX MAGAZINE 1993 ユ 0 UNIX コマンドの cp は、引数がかならす 2 つ以必 要です。 1 つの引数で実行すると、上記のようなエラー メッセージが出力されコマンドカ鮗了します。これと同 しようなことをシェル・プログラムでおこなうには、次の ような手順をします。 1. 引数の数 ( あるいは有無 ) をチェック 2. 問題があれはエラーメッセージを出力 3. シェル・プログラムを終了 引数の数は、前述したように位置パラメータの数を参照 する $ # を使うと分かります。次に、その数カ定してい る引数の数と一致しているかどうかを調査する方法には、 if コマンドと test コマンドを使います。 % cat example # ! /bin/sh if test $ # —eq 0 then $ 0 filename > & 2 ech0 Usage : exit ・ 1 then 〇 command 173
連載 / インターネットの利用と仕組みー⑥ 図 3 ニュースシステム (Cnews/NNTP) 図 4 USENET ニュースのトラフィック、 uunet ・ uu. net を 2 週間で腿する緲ヾイト数 ⅣⅣ 5 宿 ad program POST READ nntpd inews 0 肱み 0 $ な TRANSFER nntpd mews UUCP NMP こうして投稿、転送されてきたニュースは、古いもの から順に消していくようになっているの力勺な運用で す。これをおこなうのが expire という処理 ( プログラム ) です。 expire は history データベースを調べながら、 ュースが到着してから一定時間以上経過したものを消して いきます 9 。 これらの実際の処理は、 Bnews/Cnews/INN それぞ れのニュースシステムの酉己送樹冓によってさまざまな違い があります。 10 ニュースの配送機構 ニュースのネットワークを介した転送方法は多様です が、大きく分けて、アーティクルを 1 っすっ送るガ去と いくつかまとめて送るガ去があります。 1 っすっ送るのは UUCP で、 8 1985 1986 1 7 1988 1989 198 181 UUX —Z remotehost ! rnews として、 UUCP で接続されているホストに対して rnews の入力として与えるガ去と、メールとして送るガ去とがあ ります。この 2 つは sys に記述するだけで転送がおこな われます。 9 丘、ニュースの ~ 量が多いため、 dexpire というプログラムを使ってい るところもあります。 dexpire の場ま history を参をすに スグループごとに決めらオレこプライオリティに従い、所定の空きディスク 容量まで記事を消します。 history , 、辺 ) 1 郊央は別のプログラムでおこない ます。 10 具内列は、 Cnews クメ昜合になっています。 30 まとめて送るガ去はバッチ転送といい、 ニュースシス テム 11 が作るリストを、別のプログラム (sendbatch) を定期的に実行して転送をおこないます。多数のファイ ルを 1 っすっ送ると、その手順にかかるオーバーヘッ ドが大きく、とくに UUCP では 50 % 程度に効率が 落ちてしまうことがあります。記事と記事のあいだで、 # ! rnews 2345 のように記事のバイト数とともに区切り を入れてつなぎ、大きなファイルにして転送します。さら にデータ ) 宿 12 を組み合わせて効率を高めます。 送られたバッチ形式のファイルには 1 行目に形式を表 す言力咐いていて、受け取って処理するときに識別する ようになっています。 このはかに、 ihave/sendme という転送手段がありま す。ます記事のメッセージ ID の並んだリストだけを送り (ihave control message) 、リモートシステム側で his- tory データベースと照合して、未着のアーティクルだけ の転送を要求する (sendme control message) 手順です。 これは、記事の実体が届くまでに 3 回の通信が必要なの 11 Cnews では relaynews カイ乍ります。 12 compress を使用 UNIX MAGAZINE 1993 ユ 0
UN Ⅸへの招待⑩ は ( 引数が foo と bar の 2 つの場合 ) 、 と実行さ位置パラメータの数が 2 になります。 注目して、上記のプログラムのうち $@を $ * に変更してみ マンドの結果は、いすれも 2 となっています。この点に 数と同じものになります。 set の前後で実行した ech 。コ すから、その値はシェル・プログラム実行時に指定した引 メータの値を再設定しています。ただし $@を使っていま このプログラムでは、 set コマンドを使って位置パラ 再設定した位置パラメータの数は 2 位置パラメータの数は 2 ましよう。 % cat example # ! /bin/sh echo 位置パラメータの数は $ # echo 再設定した位置パラメータの数は $ # % example takashi aya 位置パラメータの数は 2 再設定した位置パラメータの数は 1 り文字である ) 空白を含む 1 つの文字列になる。 味になる。位置パラメータ本は ( 個々の引数の区切 メータ全体を二重引用符で囲んで指定したのと同し意 " $ 1 $ 2 $ 3. . " という記述と同しであり、位置パラ " $ * " の場合 意味になる。 の引数を二重引用符で囲んで個別に指定したのと同し . というと同じであり、個々 ” $@" の場合 のように扱われます。 られます。これに加え二重引用符で $@や $ * を囲むと、次 などの場合は、 $ 1 は位置パラメータの 1 番目に置き換え echo " $ 1 は、引数の 1 番目 " ています。ですから、 は、メタキャラクタ $ の働きは打ち消されないことになっ $@ と $ * の違いはここにあります。二重引用符のなかで タの数が 2 で、 $ * のときは 1 になっているのです。 となっている点が異なります。 $@のときは位置パラメー echo コマンドの結果を見ると、位置パラメータの数が 1 前回との違いは ? そうですね、 set を実行したあとの UNIX MAGAZINE 1993.10 このような理由から、前例の、 は、次のように実行さ ” f00 set " f00 " 2 行目の echo コマンドの引数は、 % example b' c d というシェル・プログラムを次のように実行すると、 echO $@ # ! /bin/sh % cat example しまいます。たとえは、 空白カ哈まれている場合は、それらが別々の引数となって 引用符はかならす付けてください。さもないと引数自身に るときは、” $@”を使っておけば間違いありません。二重 たいていの場合、位置パラメータの値すべてを利用す 部分にこの説明があります。 は、パラメータの説明部分ではなく Quoting ( 引用 ) の 位置パラメータの数が 1 になったのです。マニュアルに echo a b c d に置き換えられます。しかし、 echo ” a b " ” c " ” d" " $ としておけば、 となり、 'a b' という空白を含んだ引数が、ちゃんと 1 つ の引数になります。 shift による値のシフト 前述したように、 $ れ社 rn は位置パラメータの値が参照 171 とは、位置パラメータの値は 9 番目までしか参照できな でき、れ社 m には 0 ~ 9 までの数字が使えます。というこ