( 今月の ) のカレンダーを表示したければ、 M—x calendar-current-month を実行するか、 . ( ピリオド ) を入力してください。 令子 : きように戻って落ちついたでしよ。しゃあ、次は pd って叩いてみて。 さあ、皆さんも print day の頭文字の pd を入力する calendar—goto—date 前節で、指定した日付に移動する、 国際色豊かなカレンダー を教えてくれています。 ・ 1993 年はあと何日あるか ・ 1993 年の元旦から何日目か ( 元旦は 1 日目 ) ソルのある日が、 がエコー行に表示されましたね。上のメッセージは、カー Day 91 Of 1993 ; 274 days remaining in the を実行してみてください。メッセージ、 M—x calendar-print-day-of-year year ます。興味がある方は、 cal-mayan. el を読んでみてくださ ほかにも、マヤの暦専用の移動コマンドが用意されてい の一覧です。 ・カーソルのある日が 1 年のどこに位置するかを示すコマ 指定した日付に移動するコマンド dar が知っている暦と、そのなかで、 にもさまざまな暦をサポートしています。表 6 は calen- ところで、 calendar はグレゴリウス暦だけでなく、はか グレゴリウス暦で日付を指定します。 を紹介しましたが、このコマンドは私たちに馴染みの深い 休日 UNIX MAGAZINE 1993.5 カレンダーのある重要な機能がすっかり抜けていること emacs 入門 //\ 、 / N に気づきませんか ? 麗子 : まあ、このカレンダーは欠陥品だわ。普通のカレン ダーなら赤くて賑やかなゴールデンウィークに、なんの 印も付いていないなんて。日本国民の楽しみを奪うつも りなの ! ? そうそう、 calendar が表示するカレンダーでは祝日も 平日も区別がつきません ( 図 24 ( a ) ) 。 、、あー、うつかりして、休日に取引先との会議を入れてし まった〃 なんてことになりかねません。「この OL は実在する」と言 われたくなければ、ヾ予定を入れちゃ駄目よ〃のペケの意味 の x を叩くか、 M—x mark-calendar-holidays を実行してください。カレンダーの祝日に * が付きます ( 図 24 (b) ) 。あらあら、でもちょっと変ねえ。こんなに休みが 多かったつけ ? カレンダーの祝日マークを消すには unmark の u を叩 くか、 M —x calendar-unmark を実行します。 いつもいつも祝日マークを表示する必要はないけれど、 表 6 calendar がサポートしている暦とコマンド グレゴリウス暦 革命暦 天文暦 ISO 暦 ュリウス暦 マヤ暦 ユダヤ暦 イスラム暦 コマンド calendar-goto-date (gd) calendar-goto-islamic-date (gi) calendar-print-french-date (pf) calendar-goto-french-date (gf) calendar-print-astro-day-number (pa) calendar-goto-astro-day-number (ga) calendar-print-iso-date (pc) calendar-goto-iso-date (gc) calendar-print-julian-date ()j ) calendar-goto-julian-date ( ) calendar-print-day-of-year ()d ) 123 calendar-print-mayan-date (pm) calendar-goto-mayan-long-count-date (gml) calendar-print-hebrew-date (ph) calendar-goto-hebrew-date (gh) calendar-print-islamic-date (pi)
LJN Ⅸへの招待⑩ います。なお、パターン BEGIN は、かならす awk プログ のオプションで変更することはできません ) 。 ラムの先頭に記述しなければなりません。注意してくださ BEGIN {RS=" 次に、レコード区切り文字を変更する方法を紹介しまし 上の例では、 います。 よう。これには BEGIN のパターンを利用して、次のように 己述します 2 ( フィールド区切り文字のように、コマンド行 ( カンマ ) をレコード区切り文字にして 一三ロ awk の変数 ゝいる変数です。これには、 FS 、 RS 、 〇 FS 、 ORS 、 NF 、 組込み変数 NR 、 FILENAME などがあります。 FS (Field Separator) 前述したとおり、フィールド区切り文字とレコード区切 と RS (Record Separator) はすでに紹介したとおり、そ れぞれフィールド区切り文字とレコード区切り文字を値と り文字は、 してもちます。 OFS (Output FieId Separator) は、デー BEGIN {FS=" タを出力する際に使われるフィールド区切り文字で、デフ BEGIN {RS=" ォルトの値はスペース文字 1 つになっています。この値は、 という awk プログラムでそれぞれ変更できます。 こで print コマンドで、、 , 〃を使ったときに利用されます。たと は、このプログラムで使用している FS やなどについ えば、 て、詳しく説明しましよう。 FS とは、いすれも awk の組込み変数です。 awk プ ログラムでは、 組込み変数 ューザーが定義する変数 の 3 種類の変数が利用できます。 組込み変数とは、あらかじめ変数名とその値が決まって / % echo papa yu-suke ー awk ' {print $ 1 , $ 2 } ' papa yu—suke % echo papa yu—suke ー awk 'BEGIN {OFS=" ・ papa : yu-suke 変数 NF(Number of Fields) には、レコード中のフィ 〇 RS (Output Record Separator) は、出力時のレコー ールド数カイ直として代入されています。したがってこの変 ド区切り文字です。この値は改行文字となっており、これ 数の値は、 1 レコードが読み込まれるたびに変わります。 も print コマンドの実行時に使用されます。 print で出力 次の例では、各レコードのフィールド数を表示していま すると、出力したデータの最後に〇 RS の値カ咐加されま す。 す。 {print $ 1 , $ 2 } のようなプログラムを実行すると、 $ 1 と $ 2 にれらについ ては後述 ) のあいだに 1 つのスペース文字が出力されます が、しつはつねにスペース文字と決まっているわけではな く、〇 FS の値が利用されているのです。ですから、スペー ス文字の代わりに、、 ク ( コロン ) を使いたいときには、〇 FS の値を変更すれはよいのです。 " } {print $ 1 , $ 2 } , % cat file aya s akamot 0 2 awk の種類によっては、この方法ではレコード区切り文字を変更できないもの もあります。 SunOS の awk コマンドもその 1 つです。ただし、 nawk コマンド (New AWK: awk の新バージョン ) や gawk(GNU プロジェクトの awk コマ ンド ) などでは、この方法でレコード区切り文字を変更できます。 yu—suke 170 UNIX MAGAZINE 1993.5
IJN Ⅸへの招待⑩ awk のアクション 最後に、 awk のアクションで使用できる組込み関数につ いて紹介しておきましよう。 awk では、いくつかの関数が 定義されており、これを awk の組込み関数と呼んでいま す。変数はユーザーが定義できますが、 ( 普通の awk では ) ューザーが関数を定義することはできません。使用できる 関数は、組込み関数だけです。なお、 nawk (awk の新バー ジョン ) や gawk ( GNU プロジェクトの awk コマンド ) では、ユーザーが関数を定義できるようになっています。 awk の組込み関数には、出力関数、数学関数、文字列処 理関数などがあります。 出力関数には、 ( すでに何回も登場した ) print 、書式付き の出力がおこなえる printf 、出力結果を変数に代入する sprintf などがあります。 数学関数には、 exp ( 羃乗 ) 、 log ( 対数 ) 、 sqrt ( 平方根 ) 、 int ( 小数点以下の数を切り捨てて整数に変換 ) 、 sin 、 cos 、 tan ( 三角関数 ) などがあります。 文字列処理関数には、文字列の一部を返す substr 、文字 列の長さを返す length 、文字列が始まる位置を返す index などがあります。それぞれの使用例を見てみましよう。 % cat jfile 今泉パパさん 今泉祐介 坂本文 % awk '{print 1ength($0)}' 6 4 3 jfile length では、引数で変数あるいは文字列を指定します。 すると、その文字列の長さが返されます。日本語化された awk では、日本語のデータ 1 文字は ( 2 バイト = 2 文字で はなく ) 1 文字と数えます。 次に、 substr の例を見てみましよう。 % awk ' {print substr()l , 3 ) } ' パパさん 祐介 文 172 jfile 組込み関数 このように、 substr は次のような形式で使用します。 substr( 文字列 , れ ) この例では、、文字列〃中の番目以降の文字区り値に なります。また、 substr( 文字列 , れ , m) のような使い方もできます。この場合は、文字列の番目 の文字から襯文字ぶんの文字列カされます。 % awk '{print substr($1,3,2)}' jfile 最後に index です。 と数えます。 文 祐介 なお、 substr の場合も、日本語の 2 バイト文字は 1 文字 という形式で使います。すると、文字列のなかて最初に文 index ( 文字列 , " 文字 " ) このように index は、 0 1 1 % awk '{print index($l," 今 ")}, jfile UNIX MAGAZINE 1993.5 ( さかもと・あや ) す。では、ごきげんよう。 もっと大きなツールなどをとりあげてみようと考えていま いただけたのではないでしようか ? 次回からは心機一転、 のですが、日本語が使えることで、すこしは身近に感して をとりあげてきました。あまりよい例を載せられなかった さて、 3 回にわたって日本語が扱えるフィルタコマンド 文字列や文字の部分でも、日本語が使えます。 字が使われている位置 ( 何文字目か ) が返されます。なお、
takashi 3 1 2 % awk '{print NF}' file papa awk の NR を使っておこなっています。 致した行の行番号を表示 ) を指定した場合と同じ処理を、 次の例では、 grep コマンドで一 n オプション ( パターンに コードを読み込んでいるかを示す値が代入されています。 変数 NR (Number of Records) には、現在何個目のレ % grep ーⅡ aya file 1 : aya sakamoto % awk ' /aya/ {print NR" 1 : aya sakamoto " $ 0 } ' file 変数 FILENAME には、 awk が現在処理しているファ イルの名前が代入されています。 awk のコマンド行では、 awk ' awk プログラム ) filel fi1e2 fi1e3 のように、複数のファイル名が指定できます。この場合、 引数で指定した順番にファイルが処理されていきますが、 変数 FILENAME には、現在処理中のファイル名カイ直とし て代入されます。なお、標準入力を読み込んでいるときは、 FILENAME の値は、、 ( ハイフン ) になっています。 ユーサー定義の変数 以上の組込み変数は、あらかじめ変数名とその値や役割 /home /husb and/ yu suke /home/husband/aya /home/husband/image % ypcat passwd ー tail ー 3 ー らかしめ定義する必要はありません。必要になったときに / 変数を定義し、使うこともできます。変数の型や名前をあ が決まっていますが、このほかにユーザーが必要に応して UN Ⅸへの招待⑩ をそのまま記述します。 FS 、などの値を設定したとき は、、”〃 ( 二重引用符 ) で囲み、数値を代入する場合には数値 これからも分かるように、変数に文字列を代入する場合 BEGIN { あや = " 母 " } カ阡に入されます。 た、次の例のようにすれは、変数あやに文字列の値母〃 とすると、変数 a に数値の 1 が値として代入されます。ま BEGIN {a=l} します。たとえは、 値の代入は、 awk プログラムのアクションの部分に記述 にはアルファベットのほか、日本語の文字も使用できます。 、ゝ値を代入することで自動的に定義されます。なお、変数名 フィールド変数 わなけれはならないからです。 と、、”〃で囲んでいましたよね ? これも、値を文字として扱 BEGIN {FS=' も、 たとえは、 6 番目のフィールドを表示するときは、次のよ 指定することにより、特定のフィールドが参照できます。 数字で処理中のレコードの何番目のフィールドかを 数で、次のような形式をとります。 す。フィールド変数は、各フィールドを参照するための変 最後に、フィールド変数について簡単に触れておきま うに awk プログラムを記述します。 awk 'BEGIN {FS=" ・ " } {print $ 6 } ' UNIX MAGAZINE 1993.5 3 この例は、パスワード情報を NIS で管理している場合にしか動きません。 レクトリの部分だけを抜き出す処理をおこなっています 3 。 この例では、 UNIX のパスワード情報から、ホームディ 171
partition g ー starting cyl 7476 ( 949 / 0 / 0 ) 図 7 p (print) コマンドでパーティションを新 ( さいとう・あきのり partition> p Current partition partition a partition b partition partition d partition partition partition g ー partition れ一 partition> table (unnamed) : C e f starting starting st art ing starting starting starting starting st art ing cyl cyl cyl c yl cyl cyl cyl cyl 303 , 0 , 51 , 0 , 0 , 0 , 0 , 303 , 0 , # blocks # blocks # blocks # blocks # blocks # blocks # blocks # blocks # blocks 30 Enter new starting cyl [ 303 ] : 303 とします。 partition> Enter new # blocks [ 307476 , 949 / 0 / 0 ] : 307476 指定することもできます。たとえは、 307476 プロックと ションの大きさを、シリンダ数 / トラック数 / セクタ数で format . dat と違い、 format コマンド内では / ヾーティ いうのは 949 シリンダぶんですから、 ( 51 / 0 / 0 ) ( 252 / 0 / 0 ) ( 1252 / 0 / 0 ) 0 ( 0 / 0 / 0 ) 0 ( 0 / 0 / 0 ) 0 ( 0 / 0 / 0 ) ( 949 / 0 / 0 ) 0 ( 0 / 0 / 0 ) 307476 405648 81648 16524 れは、 partition サプコマンドのなかでも外でもかまいま ティション情報をディスクラベルとして書き込みます。 label コマンドで、ディスクのジオメトリ情報とパー ラベルの書込み ける必要はありません。 ティション・テープルから選んだだけのときは、名前を付 という未で、慣習て使われているものです。既存のパー うのは、、、ユーサーが定義した sdl のパーティション ' 名前はなんでもかまいません。 "original sdl" とい Enter table name (remember quotes) : "orxginal sdl" partition> name partition> g 303 949 / 0 / 0 でも同じです。 g ノヾーティションを未定義にしたいのなら、 partition> g 0 0 partition g ー starting cyl 7476 ( 949 / 0 / 0 ) 30 せん。 format> 1abe1 Ready tO Iabe1 disk, format> おわりに continue? y Enter new starting cyl [ 303 ] . 0 303 , # blocks Enter new # blocks [ 307476 , 949 / 0 / 0 ] : 0 partition> とします。 102 ます。 石忍できたら、設疋したパーティションに名前を付け ・ディスクの総シリンダ数を超過していない。 なっていない。 あるパーティションの末尾が別のパーティションに重 7 ) 。電卓が必要かもしれませんが、次の点を確認します。 設定がすんだら、 p(print) コマンドで表示します ( 図 予定していたハードディスクの増設方針は、都合で次回 に送らせていただきます。次回は、 NEWS のディスク増 設についてとりあげます。 大阪大学 ) UNIX MAGAZINE 1993.5
emacs 入門 ァ上で、 M—x lpr-buffer g の無変換モードのコマンド ・今回出てきたコマンドの一覧 てください。 するのか嫌いな方は、 /. emacs に図 36 の設定を追加し プリンタの設定も、 Nemacs を起動するたびに毎回設定 定する必要はありません。 が勝手に付け加えてくれるので、 lpr-switches 変数に設 印刷するファイルのファイル名は lpr ー buffer コマンド lpr—switches "¯Pmyprinter" lpr—command "mylpr' と指定するなら、次のように設疋してください。 % mylpr —Pmyprinter ファイル名 の出力を、 となっていますが、あなたのサイトではテキストファイル lpr—switches nil lpr—command " lp が 設定します。デフォルトでは、 ド名を設定します。また、 lpr-switches は引数の文字列を lpr ー command にはシェルから印刷するときのコマン lpr—switches lpr—command 定されているかを石忍してください。 います。次の 2 不頁の Emacs Lisp 変数の値が、正しく設 buffer が失敗するようなら、予定表の印刷も失敗してしま lpr-buffer コマンドに印刷処理を任せています。 lpr- かを試してください。 print-diary-entries コマンドは コマンドを実行して、バッフアの内容が印刷されるかどう 、 1- x hankaku—word 、 1- x hankaku—sentence 、 x hankaku—paragraph M-x hankaku—regxon kat akana— s entence M-x kat akana—paragraph M-X katakana—region hiragana—sentence M-x hxragana—paragraph hiragana¯reg101i select—notificatxon M-x toggl e¯egg-mode 130 、 1- x M-x V 次回予告 今回は PDS の紹介第 1 弾として、 ・日本語の入力 ・スケジュール管理 をとりあげました。次回も引き続き Emacs Lisp の PDS を紹介します。 PDS は、 ・入手が面倒 ニュースに流れているものは玉石混交 ・コマンドか難しい / 処理が重いものが多い など、役立つものをみつけるには苦労がともないます。不 況で暇な ( ! ? ) いまこそ金鉱を掘りあてるチャンス。もちろ ん、自分で錬金術するという手もあります。 ( あらい・みちこ ASTEC) 図 35 print-diary-entries の印刷出力 A11 Diary Entries Apr 1 , 1993 つき大会の日 Saturday スワヒリ語会話教室 図 36 ~ /. emacs にミロするプリンタの設定 (setq lpr—command "mylpr") (setq lpr—switches n¯Pmyprinter" ) fence-mode と無変換状態の切替え *Notification* ノヾッフアを表小 リージョンのかな文字をすべてひらがなにする 段落のかな文字をすべてひらがなにする 文のかな文字をすべてひらがなにする リージョンのかな文字をすべてカタカナにする 段落のかな文字をすべてカタカナにする 文のかな文字をすべてカタカナにする リージョンの全角文字を半角文字にする 段落の全角文字を半角文字にする 文の全角文字を半角文字にする 単語の全角文字を半角文字にする UNIX MAGAZINE 1993.5
ennacs 入門 /. / へ、、 / 図 32 mark-diary-entries でカレンダーにマークを表示 31 March 1993 ApriI 1993 May 1993 S 7 14 21 28 M 1 8 15 22 29 Tu 2 9 16 23 30 W 3 10 17 24 31 Th 4 11 18 25 F 5 12 19 26 S 6 13 20 27 S 4 11 18 25 M 5 12 19 26 Tu 6 13 20 27 W 7 14 21 28 Th 1 + 8 15 22 29 F 2 9 16 23 30 S 3 10 17 24 S 2 9 16 23 30 M 3 10 17 24 31 Tu 4 11 18 25 W 5 12 19 26 Th 6 13 20 27 F 7 14 21 28 S 1 8 15 22 29 を実行する方法です。 * Calendar ヾッフアに十マークが 現れたでしよう ( 図 32 ) 。 mark-diary-entries コマンド このコマンドでは、いつ予定が入っているかは分かりま をおこないます。 2. 予定か記入されている日の横にマーク表示 1. diary ファイルを読み込んで、 は、 、 1 ー X view—diary—entries あるいは、 M—x diary そう思ったら、十マークの日にカーソルを移動してから 、、この日の予定ってなんだっけ ? ク すが、その内容は調べられません。 UNIX MAGAZINE 1993.5 M—x show-all-diary-entries を叩くか、 アで show の、 べての日の予定を調べたくなったら * CaIendar * バッフ カーソルで指定した日の予定だけではなく、とにかくす No diary entries for Thursday, Apri1 1 , 1993 そのときはエコー行に教えてもらってください。 麗子 : 予定がなければ ? す ( 図 33 ) 。 フアカいて、カーソルで指定した日の予定力俵示されま を実行してください。もし予定が入っていれば diary バッ 図 33 view-diary-entries で指定した日の予定を表示する 師 1 , 1 嘘っき大会の日 - Ⅱ 1 イ・ March 1993 M Tu k Th F S 1 2 3 4 5 6 + 8 9 10 11 12 13 + 14 15 16 17 18 19 20 + 21 23 24 26 27 + 28 四 31 7 S p 、 i 鷓 dxa 四 ... 面 ne H ェ i 1 1 Rpril 1 3 M Tu k Th F S 1 + 2 5 6 7 8 910 + 11 12 13 14 15 16 17 + 18 19 20 21 23 24 + 26 27 28 四 30 4 S リ 1993 M Tu l•l Th 3 4 5 6 9 10 11 12 13 14 15 + 16 17 18 19 20 21 + 24 25 27 28 四 + S 2 F 7 S 1 + 8 + 図 34 show-al ト diary-entries ですべての予定を表示する 師、 1 , 1 四 3 嘘つき教の日 March 1993 S Tu k Th F S 1 2 3 4 5 6 + 7 8 9 10 11 12 13 + 14 15 16 17 18 19 20 + 21 刀 23 24 26 + 囲四 31 ーい一 ! に獗新「 「、 il 1993 Tu H Th F 1 + 2 11 12 13 14 15 16 17 + 18 19 20 21 23 24 + 26 27 囲四 凵」 . ト S S 十 S M Tu Th 9 10 11 12 13 14 15 + 16 17 18 19 加 21 + 24 25 28 四 + 31 跖 9 1993 Thu. 1 、 F S 1 + を実行します。今度はすべての予定が diary バッフアに表 示されましたね ( 図 34 ) 。 麗子 : しゃあね、予定表をシステム手帳に挟みたいから、 印刷してみせて。 予定表を印刷するには、 M—x print-diary-entries を実行してください。 diary ファイルの内容をプリンタへ 送ってくれます ( 図 35 ) 。 ただし、この連載で何度も注意しているように、一搬に 印刷はとても難しい処理の 1 つです。もし、 print-diary- entries コマンドが失敗したら、 Nemacs の適当なバッフ 129
・ h 、 H ' b ' と ' B ' は文字列とその 2 進表現を対応させるものだっ たが、 'h' と 'H' は 16 進表現との対応をおこなうものであ る。 1 , 993 という数値が 16 進でどう表されるかは、次のよ うにして確かめることができる。 print unpack('H8' , pack('l' , 1993 ) ) ; 000007C9 ' h8 ' というテンプレートを使うと下位の 4 ビットぶんが さきに表示されて、次のような結果を得る。バイトの並ぶ 順序は同じだが、上位と下位の 4 ビットが逆になっている ことが分かる。 11100000 LittIe perl pa 0 「・ 0000709C 『 Programming perl 』のなかには、ファイルの中身を 16 進ダンプする xdump というプログラムが載っている。 そのなかでは printf を用いているが、 unpack を使って次 のように実現することもできる。 while (read(STDIN, $ ー printf " % 8.81X $hex = unpack (' H* ' $hex printf " % ー 40S " , $hex; tr / \ 000 ー \ 037 \ 177 ー \ 377 / . / ; print $ ー $offset + = length; これだけでもけっこうな分量になってしまったので、今 回はここまでにしておこう。まだ触れていないものについ ては、稿を改めて説明する。 , 16 ) ) { $offset ; おわりに 本当はもっと実際の例を交えてあれこれと説明したかっ たのだが、バイナリデータの取扱いについては説明しなけ ればならないことカ噫外に多く、今回は途中で終ってしま った。できれば次回で、もっと具 ( 勺な例について説明し たいと思っ。 PerI はたしかにすぐれたテキスト処理言語だが、それだ けでは、はかのテキスト処理のツールに対して優位である とはいえない。 Perl が従来のインタープリタ型の言語と一 線を画すのは、これまで C 言語を使わざるをえなかったよ うな用途にも利用できる点である。それがデータベース機 能であり、バイナリデータ処理であり、またネットワーク WEnet 本誌では、電話回線によるフリー・ソフトウェア、ドキュメ ント、本誌掲載のリストなどの配布サーピス「 WEnet 」をお こなっています。 このサーピスは、編集部のホストにログインし、ファイルを ダウンロードするものです。事前のお申込み、パスワード登録 などは不要です。接続料・金は通言辞ト金を除き無料て一す - 俐用方 法の諞田は、本誌 1992 年 3 ~ 4 月号を参照してください ) 。 運用日繝 メンテナンス 午前 8 時 30 分 ~ 午後 2 時 40 分 午後 3 時 10 分 ~ 午後 9 時 月曜日 UNIX MAGAZINE 1993.5 機能である。そのほか、一般的なシステムコールのインタ ーフェイスももっているので、その気になればどんなこと でも実現できてしまう。これはすごいことだ。 『 Programming perl 』の日本語訳がようやく書店に出 回りはじめたらしい。とくに必要に迫られてはいないの で、まだ入手していないが、機会があればぜひ読んでみよ うと思っている。原書よりも新しいバージョンに対応して いるらしいので、うれしいかぎりだ。これを機会に、日本 の PerI ューザーの数の増加にも勢いがついてくれるとあ りがたい。 ( うたしろ・かずまさ SRA) 障害などにより、予告なしにサーピスを停止することもあり ます。また、長期にわたる停止、運月」嗤の変更は誌面を通して お知らせします。 WEnet のマシンは編集部の実験にも使用し ており、運用時間外でも着信しますが、ログインはできません。 接続号 第 1 回線 ( 03 ) 3797-1092 ( 2 , 400bps 、 V. 42/MNP5) 第 2 回線 ( 03 ) 3797-1357 ( 2 , 400bps 、 V. 42/MNP5) ※新号をえないようにご意ください。 本サーピスのホストマシンは、 ( 株 ) クボタコンピュータから機材を提供 していただいております。また、「 WEnet 」は ( 有 ) ネクストの鹵 標です。 165
36 バイトのデータを読み込んだら、さきの構造に従って $line 、 $name 、 $time という変数に分割する。 sub- str を使ってもよいが、このようにパターンマッチを使った ほうが一度にできて簡単である。 読み込んだデータのなかには無効なものもあって、その ようなデータの場合には $ time フィールドが全部 NULL ( " \ O " ) になっている。これを発見したら処理せすに読み飛 ばすことにする。 最後にデータを表示する。このときログイン名が 8 文字 より少なかった場合、その後ろには NULL が詰まってい る。たとえは { 00 というログイン名なら、 $name の値は、 " f 。。 \ 0 \ 0 \ 0 \ 0 \ 0 ” となる。これをそのまま print などで表示すると NULL がそのまま出力されてしまうため、これらの NULL 文字 を空白に置き換えている。これは取り除いてしまってもか LittIePerI pa 日 0 「・ まわない。 最後に print 文でデータを表示して、いま読み込んだデ ータに関する処理は終りである。これでほば who コマン ドと同等の働きをするコマンドを作ることができた。 この処理のなかでうまく扱えなかったのは、 ut-time フ ィールドである。次のようなプログラムで、このデータか らなんとか整直を取り出すこともできる。 $ 1 = 0 ; while ($time $ 1 = ( $ 1 くく 16 ) + ord($&); ただし、このプログラムがすべての言算機上で動くとは かぎらない。計算機のアーキテクチャによって、 4 バイト 整数のメモリ上での表現形式が異なるからである。 次に、もっと簡単にバイナリデータを扱うための方法を 説明しよう。 ( 1 ) utmp ファイルをもっと簡単に読む ( unpack ) open(UTMP , ' /etc/utmp' ) Ⅱ die "utmp: $ ! \ Ⅱ " = 36 ) { h 土 le (read(UTMP , $ ー , 36 ) ($line, $name, $host, $time) = unpack('A8 A8 A16 1 ' printf "$name $line %d ($host) \n" UNIX MAGAZINE 1993.5 ナリデータを表す文字列とのあいだの変換をどのように の引数はゞテンプレート〃と呼ばれ、 PerI の扱う値とバイ この引数について説明しよう。 pack と unpack の最初 く、そのまま整数値として扱えるかたちで格納される。 ファイルのなかのバイト列が文字列として入るのではな き受けている。 $time には、前のプログラムのように utmp という部分である。この式 1 つが、面倒な処理を一手に引 unpack('A8 A8 A16 1 ' るだろう。ポイントは、 unpack を使っている、 ものである。すいぶんとシンフ。ルになっていることが分か ( 1 ) は、前節のプログラムを unpack を使って書き直した いる。それが pack と unpack というオペレータである。 イナリデータを扱うためのインターフェイスが用意されて っきよくは文字列なのである。だが、 Perl にはより簡単にバ 処理が可能であることが分かった。バイナリといえどもけ 前節で、いままでの知識でもなんとかバイナリデータの $time if $time ; おこなうかを指定する。つまり、バイナリデータの構造を 表している。テンプレートはデータのタイプを表す文字と、 そのタイプのデータがいくつ続くかでデータ構造を指定す る。 文字 ' A ' はアスキー文字列を意味する。この例では ' A8 A8 A16 ' のように、 8 文字のアスキー文字列が 2 っと、 16 文字のアスキー文字列が 1 つ続くことを示している。 'I' は long 型整数を意味する。つまり 3 つのアスキー文字 列の後ろに、 1 つの long 型整数か読くことを示している。 それぞれのデータフィールドのあいだの空白はなくてもよ い。いまの構造を、さきの図に加えると次のようになる。 ut ー 1 ine ut —name ut-host ut-time A8 A8 A16 1 u 叩 ack の一般形は次のとおりである。 161
emacs 入門 henkan-quit (C-c 、 C-g 、く DEL>) henkan—inspect—bunsetu (M-i) diced-mode のコマント M-X edit—dict—item M-x diced—add (a) M-x diced-quit (q) M-x diced-delete (d) M-x diced—undelete (u) M-x diced—execute (x) M-x diced—next—line ( Ⅱ、 C-n) M-x diced—scroll—dovn (M-V) M-x diced—end—of—buffer (M->) calendar のコマ、 M-x calendar M-x calendar M-x calendar M-x calendar M-x calendar M-X calendar 、 1- x calendar M-x calendar M- x calendar M-x calendar M-X calendar M-X calendar M-x calendar 、 x calendar M-x calendar M-X c alendar 、 1- x calendar M-x calendar M-x calendar M-X calendar M-x calendar M-x calendar M-x calendar M- X M—X M-x c alendar —other—month ( 0 ) —current—month (c) -exchange-point-and-mark (C-x C-x) —count—days—region (M-=) -set-mark (C-@) —print—day—of-year (pd) —end—of—year (M->) -beginning-of-year ()- く ) -backward-year (C-x [ ) -forward-year (C-x ] ) —end—of—month (M-e) -beginning-of-month (M-a) —backward-month (M-{) -forvard-month (M-}) —end—of—veek (C-e) -beginning-of-veek (C-a) —backvard—veek (C-p) —f orvard—ve ek (C-n) -backward-day (C-b) -forward-day (C-f) ー ca1 endar ー ca1 endar -holidays (x) —goto—mayan—long—count—date (gml) —goto—islamic—date (gi) M-x calendar-goto—astro—day—number (ga) -goto-date (gd) M-x calendar—goto—hebrev—date (gh) M-X calendar—goto—french—date (gf) 、 1- x calendar—goto—iso—date (gc) M-x calendar—goto¯julian¯date (gj) M-x mark—calendar 132 M-x insert-yearly-diary-entry (iy) M-x insert—monthly—diary—entry (im 、 1- x insert—weekly—diary—entry (iw M-x insert—diary—entry (id) スケシュールのコマンド M-X exit—calendar (q) M-X describe—calendar—mode ( ? ) M-X calendar—phases—of—moon (M) M-X calendar—sunrise¯sunset (S) M-x list—calendar—holidays (a) M-x holidays M-X calendar—cursor—holidays ( 五 ) M-x calendar—unmark ( Ⅱ ) henkan-mode を終了して fence-mode に移行 文節の変換情報の表示 diced-mode へ移行 単語の登録 diced-mode の終了 登録済みの単語に削除マークを付ける 単語の削除マークを取り消す 単語の削除を実行 カーソルを 1 行下へ移動 画面を下へスクロール バッフアの最後へカーソルを移動 カレンダーの起動 米国型カレンダーに切替え ヨーロッパ型カレンダーに切替え 翌日へ移動 前日へ移動 翌週の同じ曜日に移動 前週の同じ曜日に移動 その週の日曜日に移動 その週の土曜日に移動 翌月に移動 前月に移動 その月の 1 日に移動 その月の末日に移動 翌年に移動 前年に移動 その年の元旦に移動 その年の大みそかに移動 元旦からの日数とその年の残りの日数を表示 カレンダーにマークを付ける マークとカーソルのあいだの日数を計算 マークとカーソルを取り替える きようの日付に移動 指定した月を表示 指定した日に移動 ュリウス暦で指定した日に移動 ISO 暦で指定した日に移動 天文暦で指定した日に移動 革命暦で指定した日に移動 イスラム暦で指定した日に移動 ユダヤ暦で指定した日に移動 マヤ暦で指定した日に移動 祝日を表示 祝日 / スケジュールのマークを消去 指定した日が祝日かどうかを表示 3 カ月ぶんの祝日を表示 3 カ月ぶんの祝日を表示 日の出 / 日の入り時刻を表示 月の満ち欠けの情報を表示 カレンダーモードの説明 カレンダーモードの終了 年月日の記入 曜日の記入 日の記入 月日の記入 UNIX MÄGAZINE 1993.5