| ホーム > Perlニュースレター > バックナンバー > 第7号 | ||||||
|
|
Perlニュースレター 第7号 (2000年5月18日)
----------------------------------------------------------------------
Perlニュースレター 第7号 (2000年5月18日発行)
http://www.context.co.jp/perlnews/ 発行部数 3367部
----------------------------------------------------------------------
▼このメールはお申し込みいただいたアドレス(cond@context.co.jp)
に無料でお届けしているものです。
▼以下のページで配送中止の手続きができます。
http://www.context.co.jp/perlnews/
======================================================================
◆◆ 目 次 ◆◆
◇ 初心者コーナー
* ハッシュ (1)
◇ Perl 5.6の新機能 (4)
◇ 最新バージョン情報
◇ 編集後記
======================================================================
■■ 初心者コーナー
======================================================================
このコーナーでは、Perlを学び始めたばかりの人を対象に、基本とな
るポイントを解説します。
今回からハッシュについて説明していきます。
----------------------------------------------------------------------
◇ハッシュとは?
ハッシュ(hash)は、複数の値(要素)をまとめて管理するための「入れ物」で
す。複数の要素をまとめて管理するという点では配列と似ています。配列では
整数の添え字によって要素を指定するのに対して、ハッシュではキー(key)と
呼ばれる文字列によって要素を指定します。
バージョン4以前の時代には、ハッシュは、連想配列(associative array)と呼
ばれていました。しかし、連想配列という名前は、通常の配列とまぎらわしい
ために、Perl 5からはハッシュと呼ぶようになりました。
ハッシュ変数は、%countのように、先頭に%を付けて表わします。ハッシュの
特定の要素を指定するには、$count{'apple'}のように書きます。これは、キー
'apple'に対応する要素を表します。配列の場合は添え字を[]で囲みましたが、
ハッシュの場合にはキーを{}で囲むという点が違います。また、要素を指定す
る場合には、先頭の文字は%ではなく、$を使うことに注意してください。
◇ハッシュの要素を操作する
ハッシュ%countを使って、果物の個数を記録することを考えましょう。リンゴ
が10個、オレンジが8個、パイナップルが3個あったとします。これをハッシュ
変数%countに記録するには、次のようにします。
$count{'apple'} = 10;
$count{'orange'} = 8;
$count{'pineapple'} = 3;
ここで、$count{'apple'}はリンゴの個数、$count{'orange'}はオレンジの個
数、$count{'pineapple'}はパイナップルの個数を表します。
リンゴの個数を表示するには、
print "リンゴは$count{'apple'}個あります。\n";
とします。また、オレンジの個数が2個増えたのなら、次のようにして個数に
加算します。
$count{'orange'} += 2;
◇キーには任意の式を使うことができる
ハッシュのキーには、任意の式を書くことができます。その場合、式を評価し
て得られた文字列がキーとして使われます。
$a = 'pine'; $b = 'apple';
$count{$a . $b} = 1; # $count{'pineapple'}に1を代入する
また、値が数値になる場合には、その数値を文字列に変換したものがキーとな
ります。
$a = 10;
$foo{$a + 3} = 100; # $foo{'13'}に100を代入する
Perl 5からは、キーが文字列定数の場合には、シングルクォートやダブルクォー
トで囲まずに、直接に{}の中に書くことができます。
$count{apple} = 10; # リンゴは10個ある
◇あるキーに対応する値が存在するかどうかをチェックする
ハッシュに登録されている要素の値を得るには、キーを指定してやります。例
えば、$count{apple}によって、ハッシュ%countからリンゴの個数を得ること
ができます。
指定したキーがハッシュに存在しない場合には、未定義値が返されます。未定
義値は「値が定義されていない」ことを示す特別な値で、文字列として使った
場合には空文字列、数値として使った場合には0として扱われます(未定義値
のことをundefと表記することがあります)。先ほどのハッシュ%countを例に
とると、$count{banana}の値はundefとなります。
このことを利用して、あるキーがハッシュに存在するかどうかを調べることが
できるように思えます。例えば、スカラー変数$fruitで指定したキーがハッシュ
%countに存在するか否かによって処理を切り分けるには、次のようにするわけ
です。
if (defined($count{$fruit})) {
# キー$fruitは登録されている
} else {
# キー$fruitは登録されていない
}
if文の条件式で使われているdefined関数は、引数が未定義値以外なら真、未
定義値なら偽を返すものです。
しかし、実はこの方法には落とし穴があります。というのは、$count{$fruit}が未
定義値だった場合、
(1) キー$fruitが存在しない
(2) キー$fruitが存在していて、その値が未定義値である
という2つの可能性があり、どちらであるかを区別できないのです。
これらを厳密に区別するには、exists関数を使います。この関数は、ハッシュ
の要素を引数として受け取り、その要素が存在すれば真を、存在しなければ偽
を返します。先ほどのコードをexists関数を使って書き換えると次のようにな
ります。
if (exists($count{$fruit})) {
# キー$fruitは登録されている
} else {
# キー$fruitは登録されていない
}
このコードは、「キー$fruitが存在していてその値が未定義値」な場合に、キー
$fruitが登録されていると正しく判定します。
======================================================================
■■ Perl 5.6の新機能 (4)
======================================================================
3月23日にPerl 5.6.0がリリースされました。前バージョン5.005のリ
リースから1年8か月ぶりの新バージョンとなります。
このコーナーでは、Perl 5.6で新たに導入された機能を紹介します。
----------------------------------------------------------------------
◇our宣言
our宣言はグローバル変数を宣言する働きをするもので、use strict 'vars'プ
ラグマと共に使用されます。
use strict 'vars'プラグマを指定した場合、グローバル変数はパッケージ名
で修飾して$package::varのように書く必要があります。パッケージ名で修飾
せずにグローバル変数を使用するとエラーになり、スクリプトは実行されませ
ん。例えば、
use strict 'vars';
$x = 10;
というスクリプトを実行しようとすると、次のようなエラーメッセージが表示
されます。(XXXXという部分は、スクリプト名になります。)
Global symbol "$x" requires explicit package name at XXXX line 2.
Execution of - aborted due to compilation errors.
our宣言は、グローバル変数をパッケージ名で修飾せず使用できるようにしま
す。our宣言はmy宣言と似ていますが、新たにローカル変数を生成するかわり
に、カレントパッケージに所属するグローバル変数をパッケージ修飾なしで使
えるようにしてくれます。our宣言の有効範囲は、my宣言と同じです。つまり、
ourによって宣言した変数は、宣言が置かれているブロック、eval、またはファ
イルの末尾まで有効です。
上のコードにour宣言を追加すると次のようになります。
use strict 'vars';
our $x;
$x = 10;
ここで、3行目の$xは、グローバル変数$main::xを表わします。
ourで宣言した変数は、宣言を行なった時点で有効なパッケージに所属します。
package文によって別パッケージに切り替えたとしても、our宣言された変数は、
あくまでも宣言時のパッケージに所属すると解釈されます。
次のコードをもとに説明しましょう。
use strict 'vars';
package a;
our $x;
$x = 10;
package b;
print $x, "\n"; # パッケージaの$x
3行目のour宣言ではパッケージaが有効です。ですから、ここで宣言された変
数$xは、パッケージaの$x、つまり$a::xを表わします。4行目では、$a::xに10
を代入します。最後の行ではパッケージbが有効です。しかし、ここで表示し
ている変数$xは3行目のourによって宣言されたものなので、パッケージaの$x
と解釈されます。
バージョン5.005以前では、use strict 'vars'プラグマを有効にした場合に、
パッケージ修飾なしでグローバル変数を使用するためには、varsプラグマを用
いました。バージョン5.6以降では、varsプラグマの代わりに、our宣言を使う
ようになりました。
◇左辺値サブルーチン
Perl 5.6.0では、サブルーチンを左辺値として使用できるようになりました。
このようなサブルーチンを、左辺値サブルーチン(lvalue subroutine)と呼
びます。perlsub(1)マニュアルページの「Lvalue subroutines」というセクショ
ンで解説されているので、そちらもご覧ください。
【注意】左辺値サブルーチンは、実験的機能と位置付けられており、現時点
ではまだ動作が不安定です。また、将来的には機能や仕様が変更さ
れる可能性があります。
左辺値サブルーチンを定義するには、次のように、sub文のサブルーチン名の
後ろに「: lvalue」を追加します。
sub lvfunc : lvalue {
$var;
}
このサブルーチンlvfuncを左辺値として使うと、変数$varの値が変更されます。
例えば、
lvfunc() = 10;
とすれば、変数$varの値は10になります。左辺値サブルーチンをインクリメン
ト演算子や代入演算子のオペランドとして使うこともできます。例えば、次の
ようにすれば、変数$varの値が1増加します。
lvfunc()++;
次のサブルーチンodd_or_evenを左辺値として使うと、引数が奇数なら$odd、
偶数なら$evenの内容が変更されます。
sub even_or_odd : lvalue {
($_[0] % 2 == 0) ? $even : $odd;
}
例えば、次のコードを実行すると、$oddは10、$evenは-1になります。
even_or_odd(3) = 10;
even_or_odd(4) = -1;
先ほど説明したように、左辺値サブルーチンはまだ実験的機能なので、制限
(やバグ)があります。今のところ、配列やハッシュを扱うことはできません。
戻り値を指定するには、return文は使えません。また、上に示した
even_or_oddでは、条件式によって戻り値を指定していますが、if文を使って
次のように書き換えるとエラーになります(これはおそらくバグだと思われま
す。)
sub even_or_odd_bad : lvalue {
if ($_[0] % 2 == 0) {
$even;
} else {
$odd;
}
}
======================================================================
■■ 最新バージョン情報 2000年5月17日現在
======================================================================
このコーナーでは、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.htm
▼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_win32.html
●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://openlab.ring.gr.jp/Jcode/index-j.html
●その他●
Perlニュースレターの発行者(近藤 嘉雪)による、Perlに関する情報をま
とめたページです。「Perlプログラミング」「初めてのPerl」に関する情報
もあります。ぜひお立ち寄りください。
▼Perl情報メモ
http://www.context.co.jp/~cond/perlinfo/
======================================================================
■■ 編集後記
----------------------------------------------------------------------
▼発行が再び大幅に遅れてしまい、誠に申しわけございません。
▼第8号は、5月30日頃発行の予定です。
近藤 嘉雪 (cond@context.co.jp)
======================================================================
Perlニュースレター 第7号 (2000年5月18日発行)
主筆:-) 近藤 嘉雪
発行元 有限会社コンテキスト(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ニュースレター」に掲載された記事を許可なく転載することを禁じます。
======================================================================
|
|||||