コンテキストのホームへ ホーム > Perlニュースレター > バックナンバー > 第9号

ホーム

Perlニュースレター

Perl情報メモ

会社情報

トレーニングコース

!!速報!!
「プログラミングPerl第3版」が発売されました。 この機会にぜひお求めください。 詳しくは こちらをクリック
 
 

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ニュースレター」に掲載された記事を許可なく転載することを禁じます。
======================================================================
ご質問・お問い合わせはperlnews@context.co.jpまで
Copyright (C) 2001 Context, Inc. All rights reserved.