無名サブルーチンとクロージャ

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

2009-05-20 無名サブルーチンとクロージャ

昨日言っていた『インナーサブルーチンを使って親のレキシカル変数をリターン値にすると、初回の値を保持するようなのです』の性質を利用するとstatic変数だけでなく、クロージャも出来ますね!


◆サンプル(closure.pl)
use strict;
use warnings;

sub closure {
    my $value = shift;
    sub { $value++ };
}

my $c = closure(100);
print $c->(), "\n";
print $c->(), "\n";
print $c->(), "\n";
print $c->(), "\n";

◆実行結果
C:\samp_pl>closure.pl
100
101
102
103

closureサブルーチンを初回コールすることにより、$valueに初期値をセットし、$valueをカウントする無名サブルーチンリファレンスを返します。この時点で$valueはstatic変数になっていますね。


そのリファレンスをスカラー変数($c)へ代入し、無名サブルーチンを実行するとstatic変数$valueがカウントされ100〜103のように出力されるわけです。


と、大まかに説明しましたが、無名サブルーチン『sub { $value++ };』のところをもうちょっと詳しく説明します。

名前の無いサブルーチンを無名サブルーチンといいます(まんま)。


無名サブルーチンは、名前が無いのでスカラー変数に代入したり、return値に指定したりします。

今回はreturn値に指定しています。ただし、returnキーワードは省略されています。

その指定された値は、サブルーチンのリファレンスになっています。


無名サブルーチンを実行するには、代入したスカラー変数からデリファレンスの『->』とサブルーチンの『()』を繋げて『$c->()』という感じで実行します。


また、Perlのサブルーチンでは最後に評価された式がreturn値になりますので、上記のclosureは以下と等価なのです。

sub closure {
    my $value = shift;
    return  sub { 
               return $value++; 
            };
}

初心者の内は、この辺でつまずくんだよなぁ・・・。

それから、クロージャそのものについては、私も詳しくないのでネットで検索してください。

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

人のよいところをどんどん見つけよう