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

ホーム

Perlニュースレター

Perl情報メモ

会社情報

トレーニングコース

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

Perlニュースレター 第8号 (2000年6月7日)

----------------------------------------------------------------------
        Perlニュースレター      第8号 (2000年6月7日発行)

        http://www.context.co.jp/perlnews/      発行部数 3570部
----------------------------------------------------------------------

  ▼このメールはお申し込みいただいたアドレス(cond@context.co.jp)
    に無料でお届けしているものです。
  ▼以下のページで配送中止の手続きができます。
         http://www.context.co.jp/perlnews/
======================================================================
◆◆  目  次  ◆◆

  ◇ 初心者コーナー
        * ハッシュ (2)
  ◇ Perl 5.6の新機能 (5)
        * 弱いリファレンス
  ◇ 最近のトピックス
        * ActiveStateがVisualPerlを開発中
  ◇ 最新バージョン情報
  ◇ 講習会開催のお知らせ
  ◇ 編集後記

======================================================================
■■ 初心者コーナー
======================================================================
        このコーナーでは、Perlを学び始めたばかりの人を対象に、基本とな
        るポイントを解説します。

        前回に引き続きハッシュについてお話ししましょう。
----------------------------------------------------------------------
◇ハッシュ全体に一挙に値を代入する

前回は、ハッシュの要素を1つずつ追加する方法を紹介しました。このほかに、
ハッシュに対してリスト値を代入することによって、ハッシュ全体を初期化す
ることも可能です。この場合、リスト値には、キーと値のペアを並べたものを
指定してやります。例えば、

        %table = ('apple' , 10, 'orange' , 8, 'pineapple', 3);

というコードを実行すると、ハッシュ%tableは、キー'apple'に対して値10、
キー'orange'に対して値8、キー'pineapple'に対して値3という3つの要素を持
つようになります。これは、

        $table{apple} = 10;
        $table{orange} = 8;
        $table{pineapple} = 3;

のように、要素に個別に値を代入するのと同じことですが、ハッシュにリスト
を代入する場合、まず最初にハッシュを空にしてから、要素の追加が行なわれ
ます。

また、ハッシュに空リストを代入すると、すべての要素が削除されて、ハッシュ
は空になります。

        %table = ();    # ハッシュ%tableは空になる

◇=>を使ってリストを記述する

Perl 5では、リストを記述する際に、カンマの代わりに=>を使うことができま
す。これを利用して、キーと値のペアを「key => value」のように書けば、キー
と値の対応がわかりやすくなります。=>はカンマと同じ働きをしますが、=>の
左側(キー)に文字列定数を指定する場合には、シングルクォートやダブルクォー
トで囲む必要はありません。

冒頭のコードを=>を使って書き換えると

        %table = (apple => 10, orange => 8, pineapple => 3);

のようになります。こちらのほうが、キーと値の対応がはっきりしてコードが
読みやすくなっています。

◇ハッシュをリストコンテキストで評価する

ハッシュ変数をリストコンテキストで評価すると、キーと値が交互に並んだリ
スト値が得られます(このリスト値は、ハッシュを初期化するのに使用するリ
スト値と同じ形をしています)。ただし、こうして得られたリスト値では、キー
が並ぶ順番が予測できないので、注意してください。

例えば、

        %h = (a => 1, b => 2);
        @a = %h;

というコードを実行すると、配列@aは

        ('a', 1, 'b', 2)        ……(a)

または

        ('b', 2, 'a', 1)        ……(b)

という値になります。(a)ではキーは'a'、'b'の順に並び、(b)では'b'、'a'の
順に並んでいますが、どちらの並び方になるかは、実行してみなければわから
ないのです。これは、ハッシュ変数を実現するのに用いられるハッシュ表とい
うデータ構造が、キーに対応する要素を高速に探し出すために、キーを特別な
並べ方で格納しているためです。

ハッシュをリストコンテキストで評価して得られるリスト値は、キーと値が交
互に並ぶという形をしているので、そのままハッシュに代入することができま
す。これによって、元のハッシュと同じ要素を持つハッシュを作ることができ
ます。

        %table = (apple => 10, orange => 8, pineapple => 3);
        @a = %table;
        %table2 = @a;   # %table2は%tableと同じ内容を持つ

また、次のように、ハッシュ変数をハッシュ変数に直接代入することによって
も、ハッシュを丸ごとコピーすることができます。

        %new = %old;    # %oldの内容を%newにコピーする

◇ハッシュをスカラーコンテキストで評価する

ハッシュをスカラーコンテキストで評価すると何が得られるでしょうか? 以前
に説明しましたが、配列の場合はスカラーコンテキストで評価すると要素の個
数が得られます。このことから類推すると、ハッシュをスカラーコンテキスト
で評価すると、ハッシュの要素の個数が得られそうな気がします。しかし、そ
うは問屋が卸さないのが、Perlの面白い(?)ところです。

ハッシュをスカラーコンテキストで評価すると、"103/128"のような文字列が
得られます。この文字列はハッシュの内部の状態を示すものですが、スクリプ
トを書く上でこの情報を利用する機会はほとんどありません。

ちなみにこの値は、ハッシュ表のエントリ(バケットといいます)の使用状況
を示しています。2番目の数字は用意したエントリの総数、1番目の数字はその
うち使用中のエントリの個数を表します。繰り返しになりますが、これらの値
は意味を覚えなくて構いません。

◇ハッシュの要素の個数を得る

ハッシュに入っている要素の個数を得るには、ハッシュを引数として受け取る
keys関数(次号で詳しく取り上げます)を使います。keys関数をスカラーコン
テキストで評価すると、引数に渡されたハッシュの要素の個数を返します。例
えば、

        $n = keys(%h);

とすれば、ハッシュ%hに入っている要素の個数が$nに得られます。

また、keys関数をprint文の引数として使う場合には、scalar関数を使ってス
カラーコンテキストを適用してやらなければなりません。例えば、ハッシュ%h
の要素の個数を表示するには、次のようにします。

        print "Hash %h has ", scalar(keys(%h)), " elements.\n";

また、この例では、ダブルクォート内の「%h」はハッシュ変数%hの値で置き換
えられず、そのまま"Hash %h has 13 elements."のように表示されることに注
意してください。なぜなら、配列変数やスカラー変数とは違い、ハッシュ変数
は変数展開の対象にはならないからです。

(次号に続く)

======================================================================
■■  Perl 5.6の新機能 (5)
======================================================================
        3月23日にPerl 5.6.0がリリースされました。前バージョン5.005のリ
        リースから1年8か月ぶりの新バージョンとなります。

        このコーナーでは、Perl 5.6で新たに導入された機能を紹介します。
----------------------------------------------------------------------
◇弱いリファレンス

Perlは、データに割り当てたメモリ領域を管理するのに、リファレンスカウン
タを使用します。リファレンスカウンタとは、そのデータを指しているリファ
レンスの個数を記録するカウンタです。

データに対するリファレンスが1個増えるごとに、リファレンスカウンタに1を
加えます。データを指していたリファレンスが1つ減るごとに、リファレンス
カウンタから1を引きます。そして、リファレンスカウンタの値が0になったら、
そのデータのメモリ領域を解放します。このように、リファレンスカウンタの
働きによって、不要になったデータのメモリ領域が確実に解放されるのです。

しかし、自分自身を指すようなリファレンスやループ状になったデータ構造で
は、外部からのリファレンスがすべてなくなったとしても、自分自身からのリ
ファレンスが残っているために、リファレンスカウンタが0になりません。そ
のために、このようなデータは、使われなくなっても解放されずに残ってしま
います。

さて、前置きが長くなってしまいましたが、Perl5.6では、リファレンスカウ
ンタによるメモリ管理の弱点を補うものとして、弱いリファレンス(weak
reference)が導入されました(ただし、5.6.0の時点ではまだ実験的な機能で
す)。弱いリファレンスは、指されているデータのリファレンスカウントを増
加させない特別なリファレンスです。

自分自身を指すようなリファレンスやループ状のリファレンスを「弱いリファ
レンス」にしておけば、外部からのリファレンスがすべてなくなった時点で、
(自分自身からの弱いリファレンスが残っていても)リファレンスカウントが
0になり、メモリ領域が解放されます。

バージョン5.6.0では、弱いリファレンスを扱うための機構がPerlインタープ
リタに組み込まれていますが、Perlスクリプト内から利用するには、別途
WeakRefモジュールをCPANから入手してインストールする必要があります。
WeakRefモジュールは、弱いリファレンスを操作するためのAPIを、Perlスクリ
プトから使えるようにするインターフェースを提供します。

◇WeakRefモジュールの使用法

WeakRefモジュールは、weaken、isweakという2つの関数を提供します。weaken
関数は、引数で指定されたリファレンスを、弱いリファレンスに変換します。
isweak関数は、引数が弱いリファレンスであれば真を、そうでなければ偽を返
します。

先ほども説明したように、弱いリファレンスはリファレンスカウンタの対象に
なりません。弱いリファレンスが指しているデータのリファレンスカウンタが
0になった(つまり、通常のリファレンスがなくなった)時点で、そのデータ
は解放され、弱いリファレンスもundefとなります。

◇弱いリファレンスの動作

次のコードを例に、弱いリファレンスの動作を見てみましょう。

          1:  #!/usr/bin/perl
          2:  
          3:  use WeakRef;
          4:  {
          5:          my $a = "foo";
          6:          $x = \$a;
          7:          $y = $x;
          8:  }
          9:  print "1: x=$x y=$y\n";
         10:  weaken($x);
         11:  print "2: x=$x y=$y\n";
         12:  print "x:[",isweak($x), "] y:[", isweak($y), "]\n";
         13:  undef($y);
         14:  print "3: x=$x y=$y\n";

まず、4〜8行目のブロックで、変数$aへリファレンスを変数$xと$yに代入しま
す。変数$aはmy宣言されているので、4〜8行目のブロック内でのみ有効です。
そのため、ブロックから抜ける際に変数$aは破棄されます。ですから、9行目
が実行される時点では、(もともと変数$aであった)無名のスカラーオブジェ
クトを、$xと$yの2つのリファレンスが指していることになります(つまり、
リファレンスカウンタは2です)。9行目のprint文は次のような出力をします。

        1: x=SCALAR(0xac70c) y=SCALAR(0xac70c)

ここで、0xac70cという部分は、リファレンスが指しているスカラーオブジェ
クトのメモリアドレスです。$xも$yも同じオブジェクトを指しているので同じ
値(0xac70c)になっています。(この0xac70cという部分は、実行環境に応じ
て異なる値となります。)

次に10行目で、weaken関数を呼び出して、$xを弱いリファレンスに変換します。
これによって、無名スカラーオブジェクトのリファレンスカウンタは1になり
ます。しかし、リファレンスの値自体は変わらないので、11行目のprint文は
次のような出力をします。

        2: x=SCALAR(0xac70c) y=SCALAR(0xac70c)

12行目のprint文では、isweak関数を使って、$xと$yが弱いリファレンスかど
うかを調べています。$xは弱いリファレンス、$yは普通のリファレンスなので、
次のように表示されます。

        x:[1] y:[]

13行目で、undef関数によって、変数$yに入っている普通のリファレンスを未
定義にします。これによって、リファレンスカウントは0になるので、無名ス
カラーオブジェクトは解放されます。また、その副作用として、変数$xに入っ
ている弱いリファレンスも強制的にundefになります。そのために、14行目の
print文では次のような表示が得られます。これは、変数$xも$yもundefになっ
たことを示しています。

        3: x= y=

======================================================================
■■  最近のトピックス
======================================================================
●ActiveStateがVisualPerlを開発中●

ActivePerlの開発で知られるActiveStateは、マイクロソフトのVisualStudio
7.0用にVisual PerlとVisual Pythonを開発する、と2000年5月24日に発表しま
した。これにより、Visual BasicやVisual C++でおなじみの開発環境を使って、
PerlやPythonのプログラムを開発できるようになるとのことです。

  ▼ActiveStateによるプレスリリース(英語)
    ActiveState joins Microsoft's Visual Studio Integration Program
      http://www.activestate.com/Corporate/Media_Center/News/Press959117519.html

======================================================================
■■  最新バージョン情報                        2000年6月6日現在
======================================================================
        このコーナーでは、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 613
        で、5.6.0をベースにしています。バイナリ(とソース)が配布され
        ています。また、Perl 5.005_03ベースのBuild 522も公開されていま
        す。

?         ▼ActivePerlの入手先(Build 522も613もここから入手可能)
?           http://www.activestate.com/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情報メモ
      http://www.context.co.jp/~cond/perlinfo/

======================================================================
■■  講習会開催のお知らせ
======================================================================

有限会社コンテキストでは、Perlの講習会の開催に向けて、鋭意準備を進めて
まいりました。このたび第1回の講習会として、7月下旬に「PerlによるCGIプ
ログラミング」を開催することとなりました。「Perlニュースレター」の執筆
者である近藤嘉雪が講師を務めます。開催地は東京で、1日のコースとなりま
す。

スケジュール、参加費などの細目が決まり次第、下記のページにてアナウンス
させていただきます。また、「PerlによるCGIプログラミング」以外にも、
「Perl初級コース」「Perl中・上級コース」などのコースも順次開催する予定
です。是非ともこの機会に参加をご検討ください。

        ▼Perlトレーニングコースのページ
          http://www.context.co.jp/training/

======================================================================
■■  編集後記
----------------------------------------------------------------------
▼VisualPerlのことを聞いたとき、正直な話、「jokeだろう」と思いました。
  しかし、jokeでなかったようです。私自身は、GUIベースの開発環境はあま
  り好きではなく、エディタでコードを書いてコマンドラインから実行する、
  というスタイルが好きなのですが、これも時代の流れなのでしょうね。
▼第9号は、6月20日頃発行の予定です。
                                近藤 嘉雪 (cond@context.co.jp)
======================================================================
Perlニュースレター 第8号 (2000年6月7日発行)

        主筆:-) 近藤 嘉雪
        発行元  有限会社コンテキスト(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.