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

ホーム

Perlニュースレター

Perl情報メモ

会社情報

トレーニングコース

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

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

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

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

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

  ◇ 初心者コーナー
        * リスト (2)
  ◇ Perl 5.6の新機能 (3)
  ◇ リソース紹介
        * メールマガジン「Perlクイズ」
  ◇ 最新バージョン情報
  ◇ 編集後記
======================================================================
■■ 初心者コーナー
======================================================================
        このコーナーでは、Perlを学び始めたばかりの人を対象に、基本とな
        るポイントを解説します。

        今回は、前回に引き続きリストについてお話しします。
----------------------------------------------------------------------
◇リストの要素には任意の式を使うことができる

これまでに紹介したリストでは、要素は文字列か数値になっていました。しか
し実際には、リストの要素はどんな式でも構いません。リスト内に置かれた式
は、リストコンテキストで評価されます。例えば、リストの中に配列を置くと、
その配列のすべての要素がそこにコピーされます。ですから、

        @a = (1, 2, 3);
        @b = ('x', 'y');
        @x = (@a, @b);

というコードを実行すると、@xは、1, 2, 3, 'x', 'y'という5つの要素を持つ
ようになります。

◇リストに対する代入

リストに対して、値を代入することができます。ただし、この場合、リストの
要素は左辺値かundefでなければなりません。左辺値(l-value)とは、「(そ
れに対して)値を代入することができるもの」のことです。左辺値という名前
は、代入式の左辺に置けるということからきています。

具体的には、スカラー変数$s、配列変数@a、ハッシュ変数%h、配列要素$a[10]、
ハッシュ要素$h{'key'}などが左辺値になります。また、スライス@a[1, 2, 3]
も左辺値になります。(スライスとは、配列やハッシュ内の複数の要素を指定
したものです。スライスについては、別の機会に解説します。) このほかに、
substr関数やvec関数も左辺値として使うことができます。

リストに対する代入の例を見てみましょう。次のコードを実行すると、$aには
1、$bには2、$cには3が代入されます。

        ($a, $b, $c) = (1, 2, 3);

また、リストへの代入は、関数が返したリスト値を複数のスカラー変数で受け
取る場合に便利です。例えば、times関数は、プロセスが消費したCPU時間を4
要素のリストとして返します(引数は受け取りません)。times関数は次のよ
うにして使われます。

        ($user, $system, $cuser, $csystem) = times;

times関数がリスト値として返す4個の値の意味は次のとおりです(値はいずれ
も秒単位)。

        ------------------------------------------------------
          値            意味
        ------------------------------------------------------
        $user       実行中のプロセスが消費したユーザCPU時間
        $system     実行中のプロセスが消費したシステムCPU時間
        $cuser      子プロセスが消費したユーザCPU時間
        $csystem    子プロセスが消費したシステムCPU時間
        ------------------------------------------------------

◇リストの要素数と代入される値の個数が一致しない場合

リストの要素の個数よりも、代入される値のほうが多い場合には、余った値は
捨てられます。例えば、

        ($a, $b, $c) = (1, 2, 3, 4, 5);

というコードを実行すると、右辺のリストの最初の3つの要素1、2、3がそれぞ
れ$a、$b、$cに代入され、残りの要素4, 5は捨てられます。

これとは逆に、リストの要素の個数よりも代入される値のほうが少ない場合、
対応する値がない変数には未定義値(undef)がセットされます。例えば、

        ($a, $b, $c) = (1, 2);

を実行すると、$aには1、$bには2、$cにはundef(未定義値)が代入されます。

◇代入されるリスト中に配列やハッシュがある場合

代入の対象となるリスト中の配列変数(またはハッシュ変数)は、それ以降の
すべての値を取り込んでしまいます。その結果、その配列(またはハッシュ)
より後ろのすべての変数には未定義値undefがセットされます。例えば、

        ($a, @b, $c, $d) = (1, 2, 3, 4);

というコードを実行すると、$aには1がセットされて、@bには2, 3, 4という3
個の要素がセットされます。そして$c、$dには、未定義値undefがセットされ
ます。

◇代入されるリスト中にundefがある場合

代入の対象となるリストの要素にundefを使うことができます。この場合、
undefに対応する値は、代入されずに捨てられます。例えば、

        ($a, undef, $b, undef, $c) = (1, 2, 3, 4, 5);

を実行すると、$aには1、$bには3、$cには5が代入されます。右辺のリストの2
番目の要素2と4番目の要素4は、代入されずに捨てられます。

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

        このコーナーでは、Perl 5.6で新たに導入された機能を紹介します。
----------------------------------------------------------------------
◇文字コードによるUnicode文字の指定: \x{nnnn}

UTF-8をサポートしているエディタを利用すれば、文字列中にじかにUnicode文
字を入れることができます。エディタがUTF-8を扱えない場合には、文字コー
ドを指定して、文字列中にUnicode文字を埋め込むことができます。それには、
\x{nnnn}というエスケープシーケンスを使います。ここで、nnnnという部分は、
16進数で表現したUnicodeの文字コードです。また、以前からある文字コード
指定(例えば\x41: 大文字のA)と区別するために、Unicode文字を指定する場
合には文字コードをブレースで囲みます。

文字コードによってUnicode文字を指定する例を次に示します。

        "\x{3042}\x{3043}\x{3044}"

ここで、0x3042は「あ」、0x3043は「い」、0x3044は「う」の文字コードです。
したがって、これは「あいう」というひらがな3文字から成る文字列になりま
す。

◇v1.2.3.4という形で文字列を記述する

文字vの後ろに、ピリオドをはさんで10進数を並べたリテラル(例えば、
v1.2.3.4)は、それらの10進数を文字コードとする文字から成る文字列と解釈
されます。文字コードはUnicodeとして解釈されます。

先ほどの「あいう」という3文字の文字列は、この記法で書くと次のようにな
ります。

        v12354.12355.12356

ここにでてくる3個の数値12354、12355、12356は、それぞれ「あ」「い」「う」
の文字コード0x3042、0x3043、0x3044を10進数で表したものです。

文字コードが3個以上の場合には、先頭のvは省略しても構いません。つまり、
上の例は次のように書くことができます。

        12354.12355.12356

◇特殊変数$^Vを利用したバージョン番号のチェック

バージョン5.005までは、特殊変数$]によって、Perlのバージョン番号を数値
として得ることができました。バージョン5.6でも$]はサポートされていて、
コマンドラインから

        $ perl -le 'print $]'

と実行すると、「5.006」と表示されます。

バージョン5.6.0からは、特殊変数$^Vによって、バージョン番号を文字列とし
て得ることができるようになりました。特殊変数$^Vとv5.6.0という形のリテ
ラルを(文字列として)比較することによって、perlインタープリタのバージョ
ンをチェックすることができます。

        # このコードは5.005以前でも動作する
        if ($^V) {
            # $^Vが定義されている: 5.6.0以降である
            if ($^V lt v5.7.0) {
                    # 5.6.xである
                    print "5.6.x\n";
            } else {
                    # 5.7.0以降のバージョンである
                    print "5.7.0 or later\n";
            }
        } else {
            # $^Vが定義されていない: 5.005以前である
            print "5.005 or earlier\n";
        }

◇printf、sprintfでv1.2.3.4を表示する

v1.2.3.4という形式の値を表示するために、printfとsprintfは%vというフォー
マット指定をサポートしています。例えば、実行しているperlのバージョンを
表示するには、次のようにします。

        printf "Version is %vd\n", $^V;

これによって、次のような出力が得られます。

        Version is 5.6.0

ここで使っているフォーマット指定%vdは、個々の数値を10進数で表示するこ
とを表します。代わりに、%vxを使えば数値が16進数で表示されます。例えば、

        $a = 100.200.300;
        printf "%vd\n", $a;
        printf "%vx\n", $a;

を実行すると、次のような出力が得られます。

        100.200.300
        64.c8.12c

◇warningsプラグマによるチェック

バージョン5.005以前では、-wオプションを指定することによって、さまざま
なチェックが行われ、問題があれば警告メッセージが表示されました。バージョ
ン5.6では、-wオプションの代わりに、warningsプラグマを使うことになりま
す(互換性のために、-wオプションも引き続きサポートされます)。

warningsプラグマは、それが置かれているブロックの内側に対してのみ有効で
す。次のコードを見てください。

        $a = "1:" + 1;          # ……(1)
        {
            use warnings;
            $a = "1:" + 1;      # ……(2)
        }
        $a = "1:" + 1;          # ……(3)

このコードでは、「"1:" + 1」という加算を3か所で行なっていますが、その
際に左オペランドの文字列"1:"が数値1に変換されます。ところで、"1:"とい
う文字列は末尾にコロンが付いているので、厳密には正しい数値の形になっ
ていません。しかし、通常はPerlは何もメッセージを出力せずに、数値に変換
してくれます。warningsプラグマを有効にすると、次のような警告メッセージ
を表示するようになります。

        Argument "1:" isn't numeric in addition (+) at - line 4.

これは、「加算+のオペランド"1:"が正しい数値の形になっていない」という
メッセージです。上のコードを実行すると、(2)の式だけに対して、この警告
メッセージが出力されます。なぜなら、warningsプラグマはブレースの内側で
だけ効力を持つので、(1)と(3)はチェックの対象外だからです。

また、ブロックの外側レベルに置いたwarningsプラグマは、そのファイルの末
尾までが有効範囲となります。モジュールを定義する際に、ファイルの先頭で
「use warnings;」と指定しておけば、そのモジュールの中だけに対してチェッ
クが行なわれます。

また、useの代わりに、noを使って、

        no warnings;

とすれば、そのブロックの末尾まで、warningsプラグマを無効にすることがで
きます。

warningsプラグマに対して、どんなチェックを行なうかを、パラメータで指定
することができます。何も指定しなければ、すべてのチェックが有効になりま
す。(また、allと指定してもすべてのチェックが有効になります。)

例えば、

        use warnings 'io';

とすれば、I/O操作関係のチェックが行なわれるようになります。指定可能な
パラメータの一覧はperllexwarn(1)マニュアルページに記載されています。

======================================================================
■■  リソース紹介
======================================================================
        このコーナーでは、Perlに関する役に立つリソースを紹介します。
----------------------------------------------------------------------
◇メールマガジン「Perlクイズ」

「Perlクイズ」は、 Perl言語を「クイズ」を通して学ぶためのメールマガジ
ンです。 結城浩さんが発行しています。

    このメールマガジンを講読すると、 Perl言語に関する「クイズ」がメー
    ルで届けられます。問題文を読んでみて、気が向いたら解答してみましょ
    う。解答は届けられたメールに返信するだけで結構。コマ切れの時間を使っ
    て、Perl言語に親しんでみませんか。料金は無料です。

        ▼Perlクイズ
          http://www.hyuki.com/pq/

======================================================================
■■  最新バージョン情報                        2000年4月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-20000212.pat.gzです。

    ▼jperl5.005_03-20000212.pat.gzの入手先
      http://www.perl.com/CPAN/authors/Hirofumi_Watanabe/jperl5.005_03-20000212.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.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/

======================================================================
■■  編集後記
----------------------------------------------------------------------
▼発行が予定より1週間遅れてしまい申しわけございません。今後は、スケジュー
  ル通りに発行するようにいたします。
▼第7号は、5月2日頃発行の予定です。
                                近藤 嘉雪 (cond@context.co.jp)
======================================================================
Perlニュースレター 第6号 (2000年4月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.