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

ホーム

Perlニュースレター

Perl情報メモ

会社情報

トレーニングコース

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

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