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

ホーム

Perlニュースレター

Perl情報メモ

会社情報

トレーニングコース

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

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

----------------------------------------------------------------------
        Perlニュースレター      第2号 (2000年2月8日発行)
        http://www.context.co.jp/perlnews/      発行部数 2089部
----------------------------------------------------------------------

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

  ◇ 初心者コーナー
       splice関数
  ◇ 関数・モジュールWho's Who
       環境変数の扱い方、Envモジュール
  ◇ 最近のトピックス
       Perl開発版5.5.640のリリース
  ◇ 最新バージョン情報
  ◇ 編集後記
======================================================================
■■  お詫びと訂正

ご購読申し込みの際にお送りしているメールの内容に一部誤りがありました。
メールではバックナンバーの入手先のURLが

   誤)    http://www.context.co.jp/perlnews/nb/

となっていますが、正しいURLは

   正)    http://www.context.co.jp/perlnews/bn/

です。ここに訂正させていただくとともに、謹んでお詫び申しあげます。

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

        今回は配列を操作する汎用の関数spliceを紹介します。
----------------------------------------------------------------------
◇配列を操作する汎用関数splice

前回は配列を操作する関数として、shift、unshift、push、popの4つの関数を
紹介しました。これらは、配列の先頭と末尾に対して、要素を追加したり、削
除したりするものでした。今回は、配列を操作する汎用の関数spliceを紹介し
ます。spliceは、配列の任意の場所に対して、要素の追加と削除を行なうこと
ができます。

splice関数は次のようにして呼び出します。

        splice(ARRAY, OFFSET, LENGTH, EXPR……)

引数ARRAYには、操作の対象となる配列を指定します。この配列の添え字
OFFSETからLENGTH個の要素を、EXPRで指定した値(複数も可)で置き換えます。
例えば、次のような内容の配列@aがあったとしましょう。

          $a[0]   $a[1]   $a[2]   $a[3]   $a[4]
        +-------+-------+-------+-------+-------+
        |  "v"  |  "w"  |  "x"  |  "y"  |  "z"  |
        +-------+-------+-------+-------+-------+

この配列@aに対して、関数spliceを

        splice(@a, 1, 2, "a", "b", "c");

のようにして呼び出すと、添え字1に当たる要素から2個の要素(つまり$a[1]
と$a[2])を削除して、代わりに"a", "b", "c"という3つの要素を挿入します。
その結果、配列@aの内容は次のようになります。

          $a[0]   $a[1]   $a[2]   $a[3]   $a[4]   $a[5]
        +-------+-------+-------+-------+-------+-------+
        |  "v"  |  "a"  |  "b"  |  "c"  |  "y"  |  "z"  |
        +-------+-------+-------+-------+-------+-------+

要素の削除/挿入にともなって、配列の長さは必要に応じて自動的に伸び縮み
します。また、操作を行なった位置より後ろにある要素は自動的にずらされま
す。この例では、2個の要素を削除してから、3個の要素を挿入したので、結果
として、配列@aの長さは1つ伸びています。

余談ですが、spliceという単語には、「(木やロープなどを)継ぎ合わせる」、
「(テープを)接合する」などという意味があります。また、8ミリのフィル
ムを接着剤(?)で貼り合わせて編集するための道具はスプライサー(splicer)
といいました(なんだか昔話になってしまいましたね)。配列を切り貼りする
からsplice関数というわけです。

◇splice関数が返す値

splice関数は、呼び出されたコンテキストによって異なる値を返します。ここ
で、コンテキストという概念についてごく簡単に説明しましょう。Perlは、関
数を呼び出す際に、何個の値を返して欲しいかを示す情報を関数に伝えます。
この情報のことをコンテキストといいます。

主なコンテキストとしては、スカラーコンテキストとリストコンテキストがあ
ります。前者は1つの値(スカラー値)が必要な場合、後者は複数の値(リス
ト値)が必要な場合です。Perlの関数の中には、どちらのコンテキストで呼び
出されたかに応じて、異なる値を返すようなものがあります。spliceもそのよ
うな関数の1つです。

どんな場合にどちらのコンテキストになるかについては、ここでは詳しく説明
しません。原則として、1つの値が必要とされる場合にはスカラーコンテキス
トとなります。例えば、関数の値をスカラー変数に代入する場合には、スカラー
コンテキストになります。これを「関数がスカラーコンテキストで評価される」
という言い方をします。また、関数が返した値を普通の演算子(例えば+、*、.
など)で演算する場合にも、その関数はスカラーコンテキストで評価されます。

これに対して、複数の値が必要な場合はリストコンテキストになります。例え
ば、関数の値を配列変数への代入する場合は、その関数はリストコンテキスト
で評価されます。また、関数やサブルーチンに渡す引数もリストコンテキスト
で評価されます。ですから、splice関数が返した値を、さらに別の関数の引数
として使っている場合には、spliceはリストコンテキストで評価されることに
なります。

さて、spliceが返す値に話を戻します。リストコンテキストでは、spliceは配
列から削除した要素のリストを返します。先ほどの例を少し代えて

        @x = splice(@a, 1, 2, 'a', 'b', 'c');

のように、spliceが返す値を@xに代入してやると、@xの内容は次のようになり
ます。

          $x[0]   $x[1]
        +-------+-------+
        |  "w"  |  "x"  |
        +-------+-------+

また、splice関数をスカラーコンテキストで呼び出すと、削除した最後の要素
を返します。ですから、先ほどの例を変えて、splice関数の戻り値をスカラー
変数$yに代入するようにしてやると、$yには"x"という文字列が代入されます。

        $y = splice(@a, 1, 2, 'a', 'b', 'c');

◇splice関数を使って要素を挿入する

これまで説明したように、要素を削除して挿入する――つまり、要素を置き換
える――というのがsplice関数の基本的な動作です。しかし、引数の指定のし
かたによっては、削除のみ、または挿入のみを行なうこともできます。

純粋に要素を挿入したいだけの場合には、LENGTH(第3引数)に0を指定してやり
ます。例えば、

          $a[0]   $a[1]   $a[2]   $a[3]   $a[4]
        +-------+-------+-------+-------+-------+
        |  "v"  |  "w"  |  "x"  |  "y"  |  "z"  |
        +-------+-------+-------+-------+-------+

という配列@aに対して、関数spliceを

        splice(@a, 1, 0, "a", "b", "c");

のように呼び出すと、$a[1]の直前に3つの要素が挿入されます(挿入は、指定
した要素の直前に対して行なわれます)。その結果、配列@aの内容は次のよう
になります。

          $a[0]   $a[1]   $a[2]   $a[3]   $a[4]   $a[5]   $a[6]   $a[7]
        +-------+-------+-------+-------+-------+-------+-------+-------+
        |  "v"  |  "a"  |  "b"  |  "c"  |  "w"  |  "x"  |  "y"  |  "z"  |
        +-------+-------+-------+-------+-------+-------+-------+-------+

◇splice関数を使って要素を削除する

挿入すべき要素を指定しないと、要素を削除することができます。例えば、

          $a[0]   $a[1]   $a[2]   $a[3]   $a[4]
        +-------+-------+-------+-------+-------+
        |  "v"  |  "w"  |  "x"  |  "y"  |  "z"  |
        +-------+-------+-------+-------+-------+

という配列@aに対して、関数spliceを

        splice(@a, 1, 3);

のように呼び出すと、$a[1]、$a[2]、$a[3]の3つの要素が削除されます。その
結果、配列@aの内容は次のようになります。

          $a[0]   $a[1]
        +-------+-------+
        |  "v"  |  "z"  |
        +-------+-------+

◇引数OFFSETやLENGTHに負の値を指定する

引数OFFSETに負の数を与えると、配列の末尾から数えて-OFFSET番目の要素が
指定されたことになります。例えば、

        @x = splice(@a, -2, 2);

とすれば、配列@aの最後の2個の要素が削除されます。また、削除された2個の
要素は配列@xにセットされます。

LENGTHを省略すると、OFFSETで指定した位置以降すべての要素が対象になりま
す。ですから、上の例は、次のように書いても同じことです。

        @x = splice(@a, -2);

LENGTHに負の数を与えると、配列の最後の-LENGTH個の要素を除いた部分を指
定したことになります。例えば、

          $a[0]   $a[1]   $a[2]   $a[3]   $a[4]   $a[5]   $a[6]
        +-------+-------+-------+-------+-------+-------+-------+
        |  "a"  |  "b"  |  "c"  |  "d"  |  "e"  |  "f"  |  "g"  |
        +-------+-------+-------+-------+-------+-------+-------+

という内容の配列@aに対して、関数spliceを

        splice(@a, 1, -3, "x");

のように呼び出したとします。OFFSETには1が指定されているので、$a[1]以降
の要素が対象になります。また、LENGTHには-3が指定されているので、$a[4]
以降の3個の要素は対象外です。ですから、結局、$a[1]、$a[2]、$a[3]の3つ
の要素が削除されて、"x"が挿入されます。その結果、配列@aの内容は次のよ
うになります。

          $a[0]   $a[1]   $a[2]   $a[3]   $a[4]
        +-------+-------+-------+-------+-------+
        |  "a"  |  "x"  |  "e"  |  "f"  |  "g"  |
        +-------+-------+-------+-------+-------+

◇shift、unshift、push、popを、splice関数で表してみる

  前回に紹介した4つの関数を、splice関数を使って書き換えると、それぞれ
次のようになります。(ここで、pushに対応するspliceの第2引数の
scalar(@a)は、配列@aの要素の個数を得るための「おまじない」です。)

        push(@a,$x,$y)     →   splice(@a,scalar(@a),0,$x,$y)
        pop(@a)            →   splice(@a,-1)
        shift(@a)          →   splice(@a,0,1)
        unshift(@a,$x,$y)  →   splice(@a,0,0,$x,$y)

なぜこのように書き換えられるかを考えてみると理解が深まると思います。

======================================================================
■■  関数・モジュールWho's Who
======================================================================
        このコーナーでは、毎回、関数やモジュールをいくつか選んで、その
        使い方や落とし穴などを、実例を交えて紹介します。

        今回のテーマは環境変数です。まず最初に、特殊ハッシュ%ENVによっ
        て環境変数を操作する方法を説明します。次に、環境変数をPerlのス
        カラー変数として扱えるようにするモジュールEnvを紹介します。
----------------------------------------------------------------------
◇環境変数はハッシュ%ENVにセットされる

UNIXなどのオペレーティングシステムでは、外部からプログラムに値を渡す手
段として、環境変数がよく用いられます。Perlのスクリプトの中では、特別な
ハッシュ%ENVによって環境変数にアクセスすることができます。ハッシュ%ENV
は、スクリプトの起動時に環境変数の値が自動的にセットされるという点を除
けば、通常のハッシュと何の違いもありません。

環境変数の値を参照するには、ハッシュ%ENVに対して、環境変数名をキーとし
て指定してやります。例えば、次のようにすれば、環境変数PATHの内容が表示
されます。

        print "PATH=", $ENV{PATH}, "\n";

また、ハッシュ%ENVの要素に値をセットすれば、環境変数の値を変えることが
できます。次の例は、環境変数PATHに値を代入するものです。

        $ENV{PATH} = "/bin:/usr/bin:/usr/local/bin";

Perlスクリプトの中から子プロセスを起動する場合(system関数、open関数に
よるパイプのオープンなど)には、%ENVハッシュの内容が環境変数として子プ
ロセスに渡されます。また、systemやopenに対して、実行するコマンドを相対
パスで指定した場合には、$ENV{PATH}の内容に従ってコマンドの探索が行なわ
れます。

◇keys関数によってすべての環境変数の名前を取得する

keys %ENVによって、すべての環境変数の名前を(順不同で)得ることができ
ます。次のようにすれば、すべての環境変数の値が表示されます。

        foreach $var (keys %ENV) {
            print "$var=$ENV{$var}\n";
        }

環境変数の名前の順に表示するには、次のように、keys %ENVの結果をsort関
数でソートしてやります。

        foreach $var (sort keys %ENV) {
            print "$var=$ENV{$var}\n";
        }

◇exists関数によって環境変数の存在をチェックする

ある環境変数が定義されているかどうかを知るには、exists関数を使います。
この関数は、ハッシュの中に、指定されたキーが存在するかどうかを調べて、
存在すれば真を、存在しなければ偽を返します。exists関数の引数は、
$hash{$key}のようなハッシュの要素の形で指定します。

例えば、FOOという環境変数があるかどうかをチェックするには、
exists($ENV{FOO})とします。次の例は、環境変数FOOが存在すればその値を表
示し、存在しなければ"FOO does not exist!"と表示します。

        if (exists($ENV{FOO})) {
            print "FOO=", $ENV{FOO}, "\n";
        } else {
            print "FOO does not exist!\n";
        }

◇delete関数によって環境変数を削除する

環境変数を削除するには、ハッシュから要素を削除するdelete関数を使います。
例えば、$varで指定された環境変数を削除するには、次のようにします。

        delete $ENV{$var};

また、%ENVの要素に空文字列や未定義値undefを代入すると、環境変数そのも
のは削除されませんが、値が空(空文字列)になります。例えば、

        $ENV{$var} = '';

を実行すると、$varで指定された環境変数の値が空になります(環境変数自体
は存在し続けます)。

◇Envモジュール

Perlに付属している標準モジュールEnvを使えば、環境変数を同じ名前のPerl
の変数として扱えるようになります。Envモジュールは、タイ変数の仕組みを
利用して、%ENVハッシュとPerlの変数を結びつけています。

Envモジュールの使い方は簡単です。プログラムの先頭付近に

        use Env;

という宣言を入れておけば、すべての環境変数が、カレントパッケージ(何も
しなければmainパッケージ)の同じ名前のPerlの変数としてアクセスできるよ
うになります。例えば、次のコードを実行すれば、あなたのPATHとHOMEが表示
されます。

        use Env;
        print "Your PATH is ", $PATH, "\n";
        print "Your HOME is ", $HOME, "\n";

また、指定した環境変数だけをPerlの変数として使えるようにすることもでき
ます。それには、use Envの引数として必要な環境変数の名前を指定してやり
ます(環境変数の先頭には$は付けません)。例えば、環境変数PATHとHOMEだ
けを、Perlの変数としてアクセスするには次のようにしてやります。

        use Env qw(PATH HOME);

Perlスクリプトの中でこのようなスカラー変数に値をセットすると、同時に
%ENVハッシュの対応する要素の値も変更されます。また、その結果として、子
プロセスに引き渡される環境変数の値も変更されます。

undef関数によって、環境変数に結びつけられたスカラー変数を未定義にする
と、対応する環境変数が削除されます。例えば、

        undef $HOME;

とすることによって、環境変数HOMEが削除されます。また、このようなスカラー
変数に未定義値を代入しても、対応する環境変数が削除されます。

        $HOME = undef;

======================================================================
■■  最近のトピックス
======================================================================
●Perl開発版5.5.640のリリース●

2月3日に、Perlの開発版のバージョン5.5.640がリリースされました。

        【注意: 開発版(development version)は、次期バージョンに向け
        た開発作業が行なわれるバージョンです。安定した動作は期待できな
        いので、通常の運用に使うシステムには向きません。】

このバージョンから、バージョン番号の付け方が変更されています。1つ前の
バージョンは5.005_63だったので、本来ならこのバージョンは5.005_64と名付
けられられたはずでした。しかし、Perlの次期バージョンが5.6となることに
合わせて、バージョン番号の付け方が変更されました。

アナウンスによれば、このバージョンは「ほぼベータ版である」
(almost-beta)とされています。また、(近い将来にリリースされるはずの)
次のバージョン5.5.650はベータ版になるだろうと予告されています。

いよいよ次期バージョン5.6のリリースも近くなってきたようです。(実際に
は、ベータ版からリリース版に至るまで、さらに数か月かかるものと思われま
す。)

   ▼Perl 5.5.640の入手先
     http://www.perl.com/CPAN-local/authors/id/GSAR/perl5.5.640.tar.gz

   ▼Perl 5.5.640のリリースとバージョン番号の付け方の変更について
     (www.perl.com掲載の記事、英語)
     http://www.perl.com/pub/n/Perl_5.5.640_Released;_version_number_scheme_changes

   ▼Perl 5.5.640リリースのアナウンス記事 (perl5 porters MLより、英語)
     http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2000-02/msg00160.html

======================================================================
■■  最新バージョン情報                        2000年2月7日現在
======================================================================
        このコーナーでは、Perl処理系とユーティリティの最新バージョンと
        その入手先を紹介します。

        行頭に◎が付いてる項目が更新された情報です。
----------------------------------------------------------------------
●perl●

  現在、perlは安定版(stable version)と開発版(development version)
  の2つのブランチに枝分かれして開発が行なわれています。

  安定版(stable version)は安定した動作を最大の目的としているバージョ
  ンです。原則として新たな機能の追加は行なわずに、バグの修正のみが行な
  われます。特に理由のない限り、安定版を使用するのがよいでしょう。

  開発版(development version)は、次期バージョンのベースとなるもので、
  どんどん新しい機能が追加されます。実験的(experimental)なバージョン
  とされており、動作の安定性は期待できません。

  ◇perl安定版(stable version)
        最新バージョンは5.005_03です。

          ▼perl 5.005_03の入手先
            http://www.perl.com/CPAN/src/stable.tar.gz

◎◇perl開発版(development version)
        最新バージョンは5.5.640です(2000年2月3日リリース)

          ▼perl 5.5.640の入手先
            http://www.perl.com/CPAN/authors/id/GSAR/perl5.5.640.tar.gz

●jperl●

  jperlは、perlを日本語対応にするためのパッチです。最新バージョンは
  jperl5.005_03-990822.pat.gzです。

    ▼jperl5.005_03-990822.pat.gzの入手先
      http://www.perl.com/CPAN/authors/Hirofumi_Watanabe/jperl5.005_03-990822.pat.gz

●Windows版●

  ◇ActivePerl
        ActivePerlは、ActiveStateによるWin32(Windows 95/98/NT)用の
        perlです。フリーで入手できます。最新バージョンはBuild 522で、
        5.005_03をベースにしています。バイナリ(とソース)が配布されて
        います。

          ▼ActivePerl Build 522の入手先
            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.shonan.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/

======================================================================
■■  編集後記
----------------------------------------------------------------------
▼少し予定よりも遅れましたが、第2号をお届けいたします。おかげさまで、
  読者数も2000人を突破いたしました。これからしばらくの間、隔週の火曜日
  に発行というペースで進めていきます。
▼第3号は、2月22日発行の予定です。
                                近藤 嘉雪 (cond@context.co.jp)
======================================================================
Perlニュースレター 第2号 (2000年2月8日発行)

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