| ホーム > Perlニュースレター > バックナンバー > 第8号 | ||||||
|
|
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ニュースレター」に掲載された記事を許可なく転載することを禁じます。
======================================================================
|
|||||