| ホーム > Perlニュースレター > バックナンバー > 第9号 | ||||||
|
|
Perlニュースレター 第9号 (2000年7月27日)
----------------------------------------------------------------------
Perlニュースレター 第9号 (2000年7月27日発行)
http://www.context.co.jp/perlnews/ 発行部数 4025部
----------------------------------------------------------------------
▼このメールはお申し込みいただいたアドレス(cond@context.co.jp)
に無料でお届けしているものです。
▼以下のページで配送中止の手続きができます。
http://www.context.co.jp/perlnews/
======================================================================
◆◆ 目 次 ◆◆
◇ 初心者コーナー
* ハッシュ (3)
◇ Perl 5.6の新機能 (6)
* pack/unpackの機能強化
◇ 最近のトピックス
* Perl 6の開発がスタート
* Programming Perlの3rd editionが発売された
◇ 最新バージョン情報
◇ 講習会開催のお知らせ
◇ 編集後記
======================================================================
■■ 初心者コーナー
======================================================================
このコーナーでは、Perlを学び始めたばかりの人を対象に、基本とな
るポイントを解説します。
前々回、前回に引き続きハッシュについてお話ししましょう。
----------------------------------------------------------------------
◇keys関数
keys関数は、引数で指定されたハッシュ変数に登録されているすべてのキーを
リスト値として返します。例えば、次のようにすれば、ハッシュ%tableに登録
されているすべてのキーのリストが@aに代入されます。
@a = keys(%table);
keys関数が返すリスト値には、ハッシュ%tableに登録されているすべてのキー
が含まれていますが、キーが並ぶ順番は不定順となります。「不定順」とは、
キーが並ぶ順番をあらかじめ予測できない、という意味です。これは前回お話
ししたように、ハッシュ変数を実現するのに使われているハッシュ表というデー
タ構造の性質に由来するものです。
◇ハッシュのすべての要素を処理する
keys関数を使えば、ハッシュのすべての要素を順に処理することができます。
それには、keys関数が返したリストをforeachループで順に処理してやります。
次のコードは、ハッシュ%tableに登録されているすべてのキーとそれに対応す
る値を表示するものです。
%table = (one => 1, two => 2, three => 3, four => 4, five => 5);
foreach $k (keys(%table)) {
print "key=$k value=$table{$k}\n";
}
1行目では、ハッシュ%tableに初期値を設定しています。2行目のforeachルー
プでは、keys(%table)によって返されたリスト値をループ変数$kに順にセット
して、ループの本体を実行します。実際には、ハッシュ%tableに登録されてい
るすべてのキーを順に変数$kにセットして、ループ本体を繰り返し実行するこ
とになります。ループの本体(3行目)では、キー$kとそれに対応する値
$table{$k}を表示します。このコードを実行すると、次のような出力が得られ
ます。
key=one value=1
key=five value=5
key=three value=3
key=two value=2
key=four value=4
先ほども説明したように、keys関数が返したリストに含まれるキーの順序は不
定となります。上の例ではキーは'one'、'five'、'three'、'two'、'four'と
いう順で並んでいますが、これは筆者が実行した環境で得られた結果です。試
しに、このコードをあなたの環境でも実行してみてください。違った並び方で
表示されるかもしれません。(もちろん、同じ並びになることもあります。)
◇sort関数を利用してキーをソートする
このようにkeys関数が返すリストでは、キーの並ぶ順序は不定となります。し
かし、キーの並ぶ順序が一定しないとなにかと不便です。例えば、同じデータ
なのに、マシンによって表示される順番が違ったとしたら、困りますね。
そこで、sort関数を使って、キーが必ず一定の順で並ぶようにソートするのが
定石となっています。sort関数は、引数に渡されたリストを、文字コード順
(アルファベット順)にソートします。先ほどのコードを、sort関数を呼び出
すように書き換えると、次のようになります。
%table = (one => 1, two => 2, three => 3, four => 4, five => 5);
foreach $k (sort (keys(%table))) {
print "key=$k value=$table{$k}\n";
}
これを実行すると、次の出力が得られます。
key=five value=5
key=four value=4
key=one value=1
key=three value=3
key=two value=2
こんどは、キーがアルファベット順に並んでいることがわかります。また、ど
んな環境で実行しても、常にこれと同じ結果が得られます。特に理由がない限
り、常にkeysとsortを組み合わせて使うことをおすすめします。
◇values関数: ハッシュのすべての値のリストを得る
values関数は、ハッシュに登録されているすべての値をリストにして返します。
keys関数と同様に、値は不定順に並びます。(実際には、keys関数が返すキー
のリストに対応する順番で、値が並びます。)
例えば、
%table = (one => 1, two => 2, three => 3, four => 4, five => 5);
foreach $v (values(%table)) {
print "value=$v\n";
}
というコードを実行すると、次のような出力が得られます。(実行する環境に
よって順番は変わります。)
value=1
value=5
value=3
value=2
value=4
◇each関数を利用してハッシュのすべての要素を処理する
ハッシュのすべての要素を処理するもう1つの方法として、each関数を使うや
り方があります。each関数はハッシュ変数を引数にとり、呼び出されるたびに、
そのハッシュから次の要素を取り出して、「キー」と「値」の2要素のリスト
値として返します。すべての要素を取り出してしまった場合、未定義を返しま
す。
each関数は、次のようにwhile文と組み合わせて使用します。このようにすれ
ば、ハッシュのすべての要素を順に処理することができます。
%table = (one => 1, two => 2, three => 3, four => 4, five => 5);
while (($key, $value) = each(%table)) {
print "key=$key value=$value\n";
}
2行目のwhile文の条件式では、each(%table)によって、キーと値のペアから成
るリスト値が得られます。このリスト値を($key, $value)という2要素のリス
トに代入しています。each関数は呼び出されるたびに、ハッシュ%tableから次
のキーと値を取り出して返します。つまり、ハッシュ%tableの各要素のキーと
値を順に$key、$valueに代入しながら、ループ本体を繰り返し実行することに
なります。
すべての要素を処理し終えるとeach関数は未定義値を返すので、while文の条
件が偽と判断されて、ループの実行が終了します。このコードを実行すると、
次のような出力が得られます。
key=one value=1
key=five value=5
key=three value=3
key=two value=2
key=four value=4
each関数が要素を返す順番は、keys関数が返すキーの並び順と同じ(つまり、
不定順)になります。
先ほど紹介したkeys関数を使った方法では、すべてのキーを含んだリストが生
成されるため、巨大なハッシュを扱う場合、メモリを大量に消費するという欠
点があります。(特に、dbmopen関数やtie関数を使って、外部のDBMファイル
に結び付けられたハッシュを扱う場合に問題になります。)そのような場合に
は、ここで紹介したeach関数を使う方法を使えば、メモリをあまり消費しない
という利点があります。
======================================================================
■■ Perl 5.6の新機能 (6)
======================================================================
3月23日にPerl 5.6.0がリリースされました。前バージョン5.005のリ
リースから1年8か月ぶりの新バージョンとなります。
このコーナーでは、Perl 5.6で新たに導入された機能を紹介します。
----------------------------------------------------------------------
◇pack/unpackの機能が強加された
バージョン5.6.0では、バイナリデータを扱うためのpack、unpack関数の機能
が強加されました。ここでは、新たに追加された型指定文字を簡単に紹介しま
す。詳しくは、perlfunc(1)マニュアルページのpack関数の項をご覧ください。
☆型指定文字qとQ
型指定文字qは符号付き64ビット長整数、Qは符号なし64ビット長整数を表しま
す。なお、qとQは、64ビット整数値をサポートしているシステム上で、Perlが
64ビット整数をサポートするようにコンパイルされた場合に限って、使用する
ことができます。
☆整数のビット長の規定が厳密になった
型指定文字s、S、n、vは、16ビット長であると規定されました。同様に、型指
定文字l、L、N、Vは、32ビット長であると規定されました。また、型指定文字
iとIは、そのマシンでのC言語のintである(少なくとも32ビット長以上)と規
定されています。
型指定文字s、S、l、Lの後ろに!を付けることによって、そのマシンでのC言語
のshortやlongを表すことができます。
☆型指定文字Z
型指定文字Zは、末尾にヌル文字("\0")が付いた、C言語風のASCII文字列を
表します。packする際には、末尾にヌル文字が詰められます(これは型指定文
字aと同じです)。unpackする際には、ヌル文字の直前までが文字列として取
り出されます。
例えば、次のコードを実行すると、$xの値は"abc"となります。
$x = unpack("Z*", "abc\0def");
☆長さ指定付き文字列: /
「長さ+文字列」という形式の文字列を扱えるようになりました。「長さを表
す型指定文字」と「文字列を表す型指定文字」の間にスラッシュ/をはさんで
指定してやります。例えば、次のコードを見てください。
$x = pack("C/a*", "camel");
ここでは、pack関数に対して、"C/a*"というテンプレートを指定しています。
最初のCは、文字列の長さをどんな形式で表現するかを決める型指定文字です。
Cは、符号無しの1バイト整数を意味します。スラッシュの後ろのa*という指定
は、文字列をそのまま格納することを表します。つまり、"C/a*"というテンプ
レートは、「先頭に文字列の長さを表す1バイトがあり、その後ろに文字列本
体が置かれる」というデータを表すことになります。上のコードを実行すると、
$xには、次のような6バイト長の文字列がセットされます。
+--------+--------+--------+--------+--------+--------+
| "\005" | "c" | "a" | "m" | "e" | "l" |
+--------+--------+--------+--------+--------+--------+
また、
$x = pack("n/a*", "camel");
を実行すると、次のような7バイト長の文字列が得られます。文字列の長さはn
と指定されているので、文字列の長さ5は、ビッグエンディアンの16ビット長
(2バイト長)整数で格納されます。
+--------+--------+--------+--------+--------+--------+--------+
| "\0" | "\005" | "c" | "a" | "m" | "e" | "l" |
+--------+--------+--------+--------+--------+--------+--------+
文字列を表す型指定文字としては、a、A、Zを指定することができます。
次にunpackの例を示します。
($x) = unpack("C/a", "\003hello");
print $x;
この例では、長さ指定がCなので、最初の1バイトが文字列のバイト長と解釈さ
れます。最初のバイトは"\003"なので、文字列本体として3バイトが取り出さ
れることになります。ですから、変数$xには"hel"という3バイト長の文字列が
セットされます。
☆コメント: #
文字#によって、pack/unpackに指定するテンプレートの中にコメントを埋め込
むことができます。packやunpack関数は、#から改行文字までをコメントとし
て読み飛ばします。
======================================================================
■■ 最近のトピックス
======================================================================
●Perl 6の開発がスタート●
7月17〜20日に米国カリフォルニア州Montereyで開催されたPerl Conference
4.0(O'Reilly Open Source Software Conventionの一部として開催)の基調
講演で、Larry Wall氏はPerl 6の開発が本格的にスタートしたことを発表しま
した。
Perl 6の開発に当たっては、Perl 5の開発とTopaz[*1]によって得られた知見
を生かして、内部的にも外部的にも完全に書き直しが行われます。また、
Larry Wall氏によると、Perl 6は「より良く、より強力に、より高速に」なり、
Perl 5からPerl 6への移行パスも用意されます。来年の夏までには、プレビュー
リリースが公開される予定です。
*1 Topazとは、Chip Salzenburg氏による、Perl処理系をC++で全面的に
書き換えるプロジェクトです。ちなみに、現行のPerlはCで記述され
ています。
Perl 6の開発モデルは、Perl 5の開発の経験、およびApacheウェブサーバや
Linuxオペレーティングシステムなどの大規模オープンソースプロジェクトの
経験を生かしたものとなります。つまり、中心となるプロジェクトマネージャ
の下に作業を行なう作業グループが置かれ、作業グループに対して開発の課題
が割り当てられるという形態になります。
また、現行のPerl 5は引き続きサポートが行なわれます。
▼Larry Wall announces broad vision for Perl 6 (プレスリリース、英語)
http://www.perl.org/perl6/pr/initial.txt
▼Perl 6 Info(Perl 6の公式情報サイト、英語)
http://www.perl.org/perl6/
▼Perl Conference 4.0(英語)
http://conferences.oreilly.com/perl4/
●Programming Perlの3rd editionが発売された●
「Camel Book(ラクダ本)」の愛称で知られるProgramming Perl(邦訳「プロ
グラミングPerl」)の第3版(英語版)が発売されました。従来の第2版に比べ
て、内容が大幅に改訂増強され、ページ数も1104ページ(!)と部厚くなってい
ます。バージョン5.6で追加された新機能もカバーしています。
▼O'Reillyによる書籍紹介(英語)
http://www.oreilly.com/catalog/pperl3/
======================================================================
■■ 最新バージョン情報 2000年7月26日現在
======================================================================
このコーナーでは、Perl処理系とユーティリティの最新バージョンと
その入手先を紹介します。
行頭に?が付いてる部分は、今回更新された情報です。
行頭に+が付いている部分は新規に追加された情報です。
----------------------------------------------------------------------
●perl●
2000年3月23日にPerl 5.6がリリースされました。しばらくの間は、 Perl
5.005とPerl 5.6の情報を提供していきます。
◇perl5.005
最新バージョンは5.005_03です。
▼perl 5.005_03の入手先
http://www.perl.com/CPAN/src/perl5.005_03.tar.gz
◇perl 5.6
最新バージョンは5.6.0です(3月23日リリース)
▼perl 5.6.0の入手先
http://www.perl.com/CPAN/src/perl-5.6.0.tar.gz
●jperl●
jperlは、perlを日本語対応にするためのパッチです。最新バージョンは
jperl5.005_03-20000401.pat.gzです。
▼jperl5.005_03-20000401.pat.gzの入手先
http://www.perl.com/CPAN/authors/Hirofumi_Watanabe/jperl5.005_03-20000401.pat.gz
●Windows版●
◇ActivePerl
ActivePerlは、ActiveStateによるWin32(Windows 95/98/NT/2000)
? 用のperlです。フリーで入手できます。最新バージョンはBuild 616
で、5.6.0をベースにしています。バイナリ(とソース)が配布され
ています。また、Perl 5.005_03ベースのBuild 522も公開されていま
す。
? ▼ActivePerlの入手先(Build 522も616もここから入手可能)
? http://www.activestate.com/Products/ActivePerl/Download.html
▼ActiveState
http://www.activestate.com/
◇JPerl for MS-Windows
ActivePerlにjperlパッチを組み込んで日本語対応にしたものです。
最新バージョンはjperl522で、ActivePerl Build 522と
jperl5.005_03-990822.pat.gzをベースにしています。バイナリ(と
ソース)が配布されています。
▼jperl522の入手先
http://www.shonanblue.ne.jp/~kipp/perl/jperl/
●Macintosh版●
◇MacPerl
Macintosh用のperlです。最新バージョンはMacPerl 5.20r4で、
5.004_04をベースにしています。バイナリ(とソース)が配布されて
います。
▼MacPerl 5.20r4の入手先
http://www.perl.com/CPAN/ports/mac/Mac_Perl_520r4_appl.bin
▼MacPerlに関する情報
http://www.perl.com/CPAN/ports/index.html#mac
◇MacJPerl(日本語版)
Macintosh用の日本語対応のperlです。最新バージョンはMacJPerl
5.2.0r4 J1です。MacPerl 5.20r4(5.004_04ベース)と
jper5.004_04-980303.patをベースにしています。バイナリが配布さ
れています。
▼MacJPerl 5.2.0r4 J1の入手先
http://world.std.com/~habilis/macjperl/MacJP5.j.htm
●日本語のコード変換ユーティリティ●
◇jcode.pl
日本語のコード変換を行うためのライブラリです(Perl 4でもPerl 5でも
使えます)。最新バージョンは2.11です。
▼jcode.pl 2.11の入手先
ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/jcode.pl-2.11
▼jcode.plの変更履歴
ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/jcode.pl-history
▼jcode.pl の私的な解説書
http://ina.kappe.co.jp/~sabre/kcode/jcode.html
◇Jcode.pm
日本語のコード変換を行うためのモジュールです(Perl 5専用。Perl
4では使えません)。最新バージョンは0.60です。
▼Jcode.pmの入手先
http://www.perl.com/CPAN/authors/id/D/DA/DANKOGAI/Jcode-0.60.tar.gz
●その他●
Perlニュースレターの発行者(近藤 嘉雪)による、Perlに関する情報をま
とめたページです。「Perlプログラミング」「初めてのPerl」に関する情報
もあります。ぜひお立ち寄りください。
▼Perl情報メモ(URLが変更になりました)
? http://www.context.co.jp/perlinfo/
======================================================================
■■ 講習会開催のお知らせ
======================================================================
有限会社コンテキストでは、8月3日に講習会「PerlによるCGIプログラミング」
を開催いたします。(前号では7月26日と予告しましたが、諸般の事情より、
日程を変更させていただきました。)
「Perlニュースレター」の執筆者である近藤嘉雪が講師を務めます。開催地は
東京・渋谷で、1日のコースとなります。詳細については、下記のページをご
覧ください。お申し込みも、このページから行なうことができます。
▼Perlトレーニングコースのページ
http://www.context.co.jp/training/
======================================================================
■■ 編集後記
----------------------------------------------------------------------
▼前号(8号)を発行してから約1か月半も間があいてしまいました。大変申し
わけございません。また、この間に購読者数は順調に増え続け、とうとう
4000人の大台を突破いたしました。今後とも、ご愛読のほどをよろしくお願
いいたします。
▼第10号は、8月15日頃発行の予定です。
近藤 嘉雪 (cond@context.co.jp)
======================================================================
Perlニュースレター 第9号 (2000年7月27日発行)
主筆:-) 近藤 嘉雪
発行元 有限会社コンテキスト(http://www.context.co.jp/)
▼バックナンバーは: http://www.context.co.jp/perlnews/bn/
▼配信申込/配信中止は: http://www.context.co.jp/perlnews/
▼ご意見・ご感想・お問い合わせは:
mailto:perlnews@context.co.jp
======================================================================
Copyright 2000 (有)コンテキスト, All rights reserved.
「Perlニュースレター」に掲載された記事を許可なく転載することを禁じます。
======================================================================
|
|||||