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

ホーム

Perlニュースレター

Perl情報メモ

会社情報

トレーニングコース

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

Perlニュースレター 第13号 (2001年7月24日)

----------------------------------------------------------------------
        Perlニュースレター      第13号 (2001年7月24日発行)

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

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

  ◇ 講習会開催のお知らせ
  ◇ 初心者コーナー
        * スライス (2)
  ◇ Larry Wall氏インタビュー (3)
  ◇ 最新バージョン情報
  ◇ 編集後記

======================================================================
■■  講習会開催のお知らせ
======================================================================

有限会社コンテキストでは、2001年8月9日に講習会「PerlによるCGIプログラ
ミング」を開催いたします。

「Perlニュースレター」の執筆者である近藤嘉雪が講師を務めます。開催地は
東京・渋谷で、1日のコースとなります。詳細については、下記のページをご
覧ください。お申し込みも、このページから行なうことができます。

開催日も迫っておりますが、まだお席に余裕がございます。ぜひご検討くださ
い。

        ▼Perlトレーニングコースのページ
          http://www.context.co.jp/training/

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

        前回(Perlニュースレター10号)に引き続きスライスについて取り上
        げます。前回の記事は以下のURLで読むことができます。

            ▼Perlニュースレター 10号
              http://www.context.co.jp/perlnews/bn/perl-newsletter-0010.html
----------------------------------------------------------------------
◇リスト値のスライス

前回に取り上げた例は、いずれも配列変数からスライスを切り出すものでした。
実を言えば、配列変数だけでなく、リスト値からもスライスを取り出すことが
できます。これは、関数が返したリスト値のうち、必要な要素を取り出すとい
うような場合に便利です。

実際に例を見てみましょう。statという組み込み関数はご存知でしょうか? 
stat関数は、Unixのstat(2)システムコールに相当するもので、ファイルに関
するさまざまな情報を返してくれます。stat関数は、引数で指定されたファイ
ルに関する情報を取得して、それを13要素のリスト値として返します。

このリスト値のうち、先頭から5番目と6番目の要素がそれぞれファイルのユー
ザID(UIDといいます)、グループID(GIDといいます)になっています。した
がって、次のようにすれば、ファイル(ファイル名は$filenameに入っている
ものとします)のUID、GIDを、それぞれ変数$uid、$gidに得ることができます。

        ($uid, $gid) = (stat($filename))[4, 5];

ここで、先頭から5番目、6番目の要素は、それぞれ添え字4、5に当たることに
注意してください。

ところで、stat関数は、指定したファイルが存在しない場合、未定義値を返し
ます。ですから、ファイルが存在するかどうかを確認するには、次のようにし
ます。

        if (($uid, $gid) = (stat($filename))[4, 5]) {
                print "UID=$uid GID=$gid\n";
        } else {
                print "File '$filename' does not exist.\n";
        }

ここでは、先ほどの式を、1行目のif文の条件式として使っています。if文の
条件式はスカラーコンテキストで評価されます。リストに対する代入式をスカ
ラーコンテキストで評価すると、実際に代入された要素の個数が得られます。
ですから、指定したファイルが存在する場合には条件式の値は2となり真と判
定され、ファイルが存在しない場合には条件式の値は0となり偽と判定されま
す。

◇範囲演算子とスライス

Perlには、範囲演算子という二項演算子があります。範囲演算子はピリオドを
2個続けたものです。範囲演算子をリストコンテキストで評価すると、左オペ
ランドの値から右オペランドまで、1ずつ増加する数値のリストを返します。
(なお、範囲演算子をスカラーコンテキストで評価すると、まったく違った動
作をしますが、ここではリストコンテキストの場合だけを説明します。)

例えば、次のコードを実行すると、@aには、5つの要素1, 2, 3, 4, 5が代入さ
れます。

        @a = (1 .. 5);  # @a = (1, 2, 3, 4, 5)と同じ

範囲演算子をスライスの添え字に使うと便利です。例えば、

        @a[3..6]

というスライスは、4つの値$a[3], $a[4], $a[5], $a[6]から成るリストを表
します。また、これは、

        @a[3, 4, 5, 6]

と書くのと同じことになります。

◇配列の一部の要素を逆順にする

Perlには、引数に与えたリストを逆順にして返すreverse関数というものがあ
ります。例えば、

        @a = reverse(1 .. 5);
        print "@a\n";

を実行すると次のような結果が表示されます。

        5 4 3 2 1

また、次のようにすれば、配列@aの中身を逆順に並べ換えることができます。

        @a = reverse(@a);

このreverse関数をスライスと組み合わせれば、配列のうちの一部分を逆順に
並べ換えることができます。例えば、

        @a = (0 .. 9);
        @a[3..6] = reverse @a[3..6];
        print "@a\n";

を実行すると、次のように表示されます。

        0 1 2 6 5 4 3 7 8 9

また、このコードの2行目を

        @a[3..6] = @a[reverse(3..6)];

や

        @a[reverse(3..6)] = @a[3..6];

などとしても同じ結果が得られます。「やり方はいろいろある」というわけで
す。なぜ同じ結果になるのか考えてみてください。

◇ハッシュのスライス

ハッシュからスライスを取り出すこともできます。例えば、ハッシュ%tableか
ら、キーaとbに対する値を得るには

        @table{'a', 'b'}

とします。これは、

        ($table{'a'}, $table{'b'})

と同じことになります。

ハッシュのスライスの場合、先頭には(%ではなく)@を使うことに注意してく
ださい。またハッシュであることを示すために、キーのリストはブレース{}で
囲んでやります。

例えば、

        @table{'one', 'two', 'three'} = (1, 2, 3);

というコードは、ハッシュ%tableの'one'、'two'、'three'という3つのキーに
対して、それぞれ1, 2, 3という値をセットします。これは、次のように、個々
の要素に値を代入するのと同じことです。

        $table{'one'} = 1;
        $table{'two'} = 2;
        $table{'three'} = 3;

======================================================================
■■ Larry Wall氏インタビュー (3)
=====================================================================

Perlニュースレターでは、2000年11月29日から12月1日にかけて、京都で開催
されたPerl/Rubyカンファレンスのために来日したLarry Wall氏にインタビュー
を行ないました。そのインタビューの内容を、12号に引き続きお届けいたしま
す。(聞き手: 近藤 嘉雪)
----------------------------------------------------------------------
●ジョークについて

Perlニュースレター(以下PNL): Camel book(「プログラミングPerl」)の
第1版(ピンクの表紙のもの)では、ジョークが盛り沢山で訳すのにとても苦
労しました。でも、第2版(青い表紙のもの)になって、かなりジョークが減っ
ていますね。私(近藤)としては、翻訳が楽で助かったのですが、どのような
事情があったのでしょうか?

Larry Wall氏(以下L): アメリカでは、あのような語呂あわせ、ダジャレの
ことをpunといいます。なぜ第2版ではジョーク(pun)を減らしたかといえば、
第1に、ジョークは翻訳しにくいということが判明したからです(笑)。

PNL: 同意します(笑)。

L: 実は、私は日本のアニメのファンなのですが、アメリカで売っている日本
製のアニメのビデオには、「このシーンのジョークはこれこれこういう意味で
面白いのである」などといった詳しい解説文が付属してるんです。【追記:お
気に入りは「うる星やつら」だそうです】。

PNL: まるで「プログラミングPerl」第1版の日本語訳のようです(笑)。

L: そうですね(笑)。第1版では、特に「用語集」の部分にたくさんのジョー
クをつめ込んでありました。

PNL: 【遠い目をして】ええ、「用語集」の翻訳には本当に苦労しました。

L: でも、「用語集」は意味がわからない用語があった時に、辞書のように引
くものです。そんな切羽詰った状況で、「用語集」を引いてみたら、そこには
愚にもつかないダジャレが載っていた、というのでは読者は「冗談じゃない!」
と思うでしょう。そんなわけで、第2版では、「用語集」にはほとんどジョー
クを入れてありません。

むしろ、ジョークは、本文を読み進んでいる読者の気分を転換するような使い
方が適切だと考えています。そのようなジョークは、ふんだんに入れてありま
す。

PNL: ところで、読者からの反応はどんなものでしょうか?

L: 読者は、おおむねジョークを受け入れてくれているようです。でも、中に
は、【しかめっ面をして真面目な口調で】「コンピュータサイエンスの本は、
こういった類いのスタイルで記述されるべきではない」などというメールをく
れる人もいます。ごくたまにですがね(笑)。いずれにせよ、読者層が幅広い
ので、万人を満足させる書き方というのはできないわけです。

あと、「初めてのPerl」の著者(の1人)のRandal Schwartzさんもこの手のジョー
クは大好きなんです。また、出版元のO'Reilly and Associatesの社長である
Tim O'Reillyさんの名誉のために付け加えておきますと、彼もこのようなユー
モアには理解を示してくれます。

PNL: 今日は、貴重なお時間をいただいて、インタビューにお答えいただき大
変ありがとうございました。

L: 【日本語で】ドウイタシマシテ。

======================================================================
■■  最新バージョン情報                        2001年7月23日現在
======================================================================
        今後は、最新バージョン情報の差分情報だけをお届けします。
        詳しい情報は以下のページをご覧ください。

        ▼Perl情報メモ
          http://www.context.co.jp/perlinfo/
----------------------------------------------------------------------
【5月23日以降の更新情報】

  ◇ActivePerlのバージョンが5.6.1 Buld 628になりました。

  ◇Jcode.pmのバージョンが0.75になりました。

======================================================================
■■  編集後記
----------------------------------------------------------------------
▼第14号は、2001年8月7日頃発行の予定です。

                                近藤 嘉雪 (cond@context.co.jp)
======================================================================
Perlニュースレター 第13号 (2001年7月24日発行)

        執筆    近藤 嘉雪
        発行元  有限会社コンテキスト(http://www.context.co.jp/)

▼バックナンバーは:     http://www.context.co.jp/perlnews/bn/
▼配信申込/配信中止は:  http://www.context.co.jp/perlnews/
▼ご意見・ご感想・お問い合わせは:
                        mailto:perlnews@context.co.jp
======================================================================
Copyright 2001  (有)コンテキスト, All rights reserved.
「Perlニュースレター」に掲載された記事を許可なく転載することを禁じます。
======================================================================
ご質問・お問い合わせはperlnews@context.co.jpまで
Copyright (C) 2001 Context, Inc. All rights reserved.