131
. . . . Perl 中級者への道 近藤 嘉雪 @yoshiyuki kondo PerlCasual #4 (2011/4/28) 近藤 嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 1 / 44

Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

  • Upload
    -

  • View
    21.858

  • Download
    6

Embed Size (px)

DESCRIPTION

PerlCasual #4 (2011/4/28, 池袋ジュンク堂)で行ったトークのスライドです。 動画をYouTubeで公開しているので、あわせてご覧ください。http://youtu.be/kLt2aYN7UYE, http://youtu.be/xVC9pqCe8cE

Citation preview

Page 1: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

.

.. ..

.

.

Perl中級者への道

近藤嘉雪

@yoshiyuki kondo

PerlCasual #4 (2011/4/28)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 1 / 44

Page 2: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

自己紹介

近藤嘉雪 (こんどうよしゆき)

Twitter@yoshiyuki_kondo

ホームページhttp://www.kondoyoshiyuki.com/

訳書「プログラミング Perl」「初めての Perl」

著書「定本 Cプログラマのためのアルゴリズムとデータ構造」「定本 Javaプログラマのためのアルゴリズムとデータ構造」

好きなもの:エディタ: Emacs日本語入力方式: T-Code (2ストローク直接入力)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 2 / 44

Page 3: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

自己紹介

近藤嘉雪 (こんどうよしゆき)Twitter

@yoshiyuki_kondo

ホームページhttp://www.kondoyoshiyuki.com/

訳書「プログラミング Perl」「初めての Perl」

著書「定本 Cプログラマのためのアルゴリズムとデータ構造」「定本 Javaプログラマのためのアルゴリズムとデータ構造」

好きなもの:エディタ: Emacs日本語入力方式: T-Code (2ストローク直接入力)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 2 / 44

Page 4: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

自己紹介

近藤嘉雪 (こんどうよしゆき)Twitter

@yoshiyuki_kondo

ホームページhttp://www.kondoyoshiyuki.com/

訳書「プログラミング Perl」「初めての Perl」

著書「定本 Cプログラマのためのアルゴリズムとデータ構造」「定本 Javaプログラマのためのアルゴリズムとデータ構造」

好きなもの:エディタ: Emacs日本語入力方式: T-Code (2ストローク直接入力)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 2 / 44

Page 5: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

自己紹介

近藤嘉雪 (こんどうよしゆき)Twitter

@yoshiyuki_kondo

ホームページhttp://www.kondoyoshiyuki.com/

訳書「プログラミング Perl」「初めての Perl」

著書「定本 Cプログラマのためのアルゴリズムとデータ構造」「定本 Javaプログラマのためのアルゴリズムとデータ構造」

好きなもの:エディタ: Emacs日本語入力方式: T-Code (2ストローク直接入力)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 2 / 44

Page 6: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

自己紹介

近藤嘉雪 (こんどうよしゆき)Twitter

@yoshiyuki_kondo

ホームページhttp://www.kondoyoshiyuki.com/

訳書「プログラミング Perl」「初めての Perl」

著書「定本 Cプログラマのためのアルゴリズムとデータ構造」「定本 Javaプログラマのためのアルゴリズムとデータ構造」

好きなもの:

エディタ: Emacs日本語入力方式: T-Code (2ストローク直接入力)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 2 / 44

Page 7: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

自己紹介

近藤嘉雪 (こんどうよしゆき)Twitter

@yoshiyuki_kondo

ホームページhttp://www.kondoyoshiyuki.com/

訳書「プログラミング Perl」「初めての Perl」

著書「定本 Cプログラマのためのアルゴリズムとデータ構造」「定本 Javaプログラマのためのアルゴリズムとデータ構造」

好きなもの:エディタ:

Emacs日本語入力方式: T-Code (2ストローク直接入力)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 2 / 44

Page 8: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

自己紹介

近藤嘉雪 (こんどうよしゆき)Twitter

@yoshiyuki_kondo

ホームページhttp://www.kondoyoshiyuki.com/

訳書「プログラミング Perl」「初めての Perl」

著書「定本 Cプログラマのためのアルゴリズムとデータ構造」「定本 Javaプログラマのためのアルゴリズムとデータ構造」

好きなもの:エディタ: Emacs

日本語入力方式: T-Code (2ストローク直接入力)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 2 / 44

Page 9: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

自己紹介

近藤嘉雪 (こんどうよしゆき)Twitter

@yoshiyuki_kondo

ホームページhttp://www.kondoyoshiyuki.com/

訳書「プログラミング Perl」「初めての Perl」

著書「定本 Cプログラマのためのアルゴリズムとデータ構造」「定本 Javaプログラマのためのアルゴリズムとデータ構造」

好きなもの:エディタ: Emacs日本語入力方式:

T-Code (2ストローク直接入力)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 2 / 44

Page 10: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

自己紹介

近藤嘉雪 (こんどうよしゆき)Twitter

@yoshiyuki_kondo

ホームページhttp://www.kondoyoshiyuki.com/

訳書「プログラミング Perl」「初めての Perl」

著書「定本 Cプログラマのためのアルゴリズムとデータ構造」「定本 Javaプログラマのためのアルゴリズムとデータ構造」

好きなもの:エディタ: Emacs日本語入力方式: T-Code (2ストローク直接入力)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 2 / 44

Page 11: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

はじめに

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 3 / 44

Page 12: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

中級者への道

Perlは敷居の低い、とっつきやすい言語です。でも、奥もとっても深い言語です。「初めてのPerl」を読み終えた後に、中級者を目指すには、どんなこと知識が必要かを紹介します。

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 4 / 44

Page 13: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

中級者への道

Perlは敷居の低い、とっつきやすい言語です。

でも、奥もとっても深い言語です。「初めてのPerl」を読み終えた後に、中級者を目指すには、どんなこと知識が必要かを紹介します。

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 4 / 44

Page 14: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

中級者への道

Perlは敷居の低い、とっつきやすい言語です。でも、奥もとっても深い言語です。

「初めてのPerl」を読み終えた後に、中級者を目指すには、どんなこと知識が必要かを紹介します。

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 4 / 44

Page 15: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

中級者への道

Perlは敷居の低い、とっつきやすい言語です。でも、奥もとっても深い言語です。「初めてのPerl」を読み終えた後に、中級者を目指すには、どんなこと知識が必要かを紹介します。

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 4 / 44

Page 16: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

良い子のお約束

スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと

#!/usr/bin/perl

use strict;

use warnings;

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 5 / 44

Page 17: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

良い子のお約束

スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと

#!/usr/bin/perl

use strict;

use warnings;

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 5 / 44

Page 18: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

良い子のお約束

スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと

#!/usr/bin/perl

use strict;

use warnings;

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 5 / 44

Page 19: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

use strictプラグマ

use strictプラグマ宣言されていない変数をエラーにする

ただし、パッケージ修飾した変数は OK

#!/usr/bin/perl

use strict;

use warnings;

$foo = 10; # エラー $foomy $bar = 2;

print $foo, "\n"; # エラー $fooprint $bar, "\n";

print $x, "\n"; # エラー $x

エラーメッセージGlobal symbol "$foo" requires explicit package name at ....

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 6 / 44

Page 20: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

use strictプラグマ

use strictプラグマ宣言されていない変数をエラーにする

ただし、パッケージ修飾した変数は OK

#!/usr/bin/perl

use strict;

use warnings;

$foo = 10; # エラー $foomy $bar = 2;

print $foo, "\n"; # エラー $fooprint $bar, "\n";

print $x, "\n"; # エラー $x

エラーメッセージGlobal symbol "$foo" requires explicit package name at ....

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 6 / 44

Page 21: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

use strictプラグマ

use strictプラグマ宣言されていない変数をエラーにする

ただし、パッケージ修飾した変数は OK

#!/usr/bin/perl

use strict;

use warnings;

$foo = 10; # エラー $foomy $bar = 2;

print $foo, "\n"; # エラー $fooprint $bar, "\n";

print $x, "\n"; # エラー $x

エラーメッセージGlobal symbol "$foo" requires explicit package name at ....

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 6 / 44

Page 22: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

use strictプラグマ

use strictプラグマ宣言されていない変数をエラーにする

ただし、パッケージ修飾した変数は OK

#!/usr/bin/perl

use strict;

use warnings;

$foo = 10; # エラー $foomy $bar = 2;

print $foo, "\n"; # エラー $fooprint $bar, "\n";

print $x, "\n"; # エラー $x

エラーメッセージGlobal symbol "$foo" requires explicit package name at ....

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 6 / 44

Page 23: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

warningsプラグマ

use warningsプラグマ怪しげな事をすると、警告メッセージを表示してくれる

#!/usr/bin/perl

use strict;

use warnings;

my $foo = "10xxx";

my $x = $foo + 5; # $fooの文字列値が数値の形になってないmy $bar;

print "$bar\n"; # $barには未定義値 undefが入っている

表示される警告メッセージ

Argument "10xxx" isn’t numeric in addition (+) at ....

Use of uninitialized value $bar in concatenation (.) or string at ....

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 7 / 44

Page 24: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

warningsプラグマ

use warningsプラグマ怪しげな事をすると、警告メッセージを表示してくれる

#!/usr/bin/perl

use strict;

use warnings;

my $foo = "10xxx";

my $x = $foo + 5; # $fooの文字列値が数値の形になってないmy $bar;

print "$bar\n"; # $barには未定義値 undefが入っている

表示される警告メッセージ

Argument "10xxx" isn’t numeric in addition (+) at ....

Use of uninitialized value $bar in concatenation (.) or string at ....

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 7 / 44

Page 25: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

warningsプラグマ

use warningsプラグマ怪しげな事をすると、警告メッセージを表示してくれる

#!/usr/bin/perl

use strict;

use warnings;

my $foo = "10xxx";

my $x = $foo + 5; # $fooの文字列値が数値の形になってないmy $bar;

print "$bar\n"; # $barには未定義値 undefが入っている

表示される警告メッセージ

Argument "10xxx" isn’t numeric in addition (+) at ....

Use of uninitialized value $bar in concatenation (.) or string at ....

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 7 / 44

Page 26: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

warningsプラグマ

use warningsプラグマ怪しげな事をすると、警告メッセージを表示してくれる

#!/usr/bin/perl

use strict;

use warnings;

my $foo = "10xxx";

my $x = $foo + 5; # $fooの文字列値が数値の形になってないmy $bar;

print "$bar\n"; # $barには未定義値 undefが入っている

表示される警告メッセージ

Argument "10xxx" isn’t numeric in addition (+) at ....

Use of uninitialized value $bar in concatenation (.) or string at ....

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 7 / 44

Page 27: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

良い子のお約束

#!/usr/bin/perl

use strict;

use warnings;

いわゆるポカミスを見つけてくれる

絶対に指定すること!!

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 8 / 44

Page 28: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

良い子のお約束

#!/usr/bin/perl

use strict;

use warnings;

いわゆるポカミスを見つけてくれる

絶対に指定すること!!

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 8 / 44

Page 29: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

良い子のお約束

#!/usr/bin/perl

use strict;

use warnings;

いわゆるポカミスを見つけてくれる

絶対に指定すること!!

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 8 / 44

Page 30: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

はじめに

良い子のお約束

#!/usr/bin/perl

use strict;

use warnings;

いわゆるポカミスを見つけてくれる

絶対に指定すること!!

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 8 / 44

Page 31: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

ファイルハンドルとopen関数

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 9 / 44

Page 32: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

ファイルをオープンする

「初めてのPerl」の書き方open INPUT, "<mydata" or die "Cannot open ’mydata’: $!\n";

while (<INPUT>) {

print $_;

}

close INPUT;

現在では推奨されない

モダンな書き方open my $input, "<", "mydata" or die "Cannot open ’mydata’: $!\n";

while (<$input>) {

print $_;

}

close $input;

ファイルハンドルに、レキシカルなスカラー変数$inputを使っている

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 10 / 44

Page 33: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

ファイルをオープンする

「初めてのPerl」の書き方open INPUT, "<mydata" or die "Cannot open ’mydata’: $!\n";

while (<INPUT>) {

print $_;

}

close INPUT;

現在では推奨されない

モダンな書き方open my $input, "<", "mydata" or die "Cannot open ’mydata’: $!\n";

while (<$input>) {

print $_;

}

close $input;

ファイルハンドルに、レキシカルなスカラー変数$inputを使っている

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 10 / 44

Page 34: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

ファイルをオープンする

「初めてのPerl」の書き方open INPUT, "<mydata" or die "Cannot open ’mydata’: $!\n";

while (<INPUT>) {

print $_;

}

close INPUT;

現在では推奨されない

モダンな書き方open my $input, "<", "mydata" or die "Cannot open ’mydata’: $!\n";

while (<$input>) {

print $_;

}

close $input;

ファイルハンドルに、レキシカルなスカラー変数$inputを使っている

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 10 / 44

Page 35: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

ファイルをオープンする

「初めてのPerl」の書き方open INPUT, "<mydata" or die "Cannot open ’mydata’: $!\n";

while (<INPUT>) {

print $_;

}

close INPUT;

現在では推奨されない

モダンな書き方open my $input, "<", "mydata" or die "Cannot open ’mydata’: $!\n";

while (<$input>) {

print $_;

}

close $input;

ファイルハンドルに、レキシカルなスカラー変数$inputを使っている

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 10 / 44

Page 36: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

モダンな書き方

3引数の open関数を使うopen my $input, "<", "mydata"

第 1引数で指定したスカラー変数に、ファイルハンドルが格納される

通常はこの例のように、第 1引数の変数を同時に my宣言する

第 2引数では、入出力の方向を指定する第 3引数では、対象となるファイル名を指定する

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 11 / 44

Page 37: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

モダンな書き方

3引数の open関数を使うopen my $input, "<", "mydata"

第 1引数で指定したスカラー変数に、ファイルハンドルが格納される

通常はこの例のように、第 1引数の変数を同時に my宣言する

第 2引数では、入出力の方向を指定する第 3引数では、対象となるファイル名を指定する

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 11 / 44

Page 38: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

モダンな書き方

3引数の open関数を使うopen my $input, "<", "mydata"

第 1引数で指定したスカラー変数に、ファイルハンドルが格納される

通常はこの例のように、第 1引数の変数を同時に my宣言する

第 2引数では、入出力の方向を指定する

第 3引数では、対象となるファイル名を指定する

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 11 / 44

Page 39: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

モダンな書き方

3引数の open関数を使うopen my $input, "<", "mydata"

第 1引数で指定したスカラー変数に、ファイルハンドルが格納される

通常はこの例のように、第 1引数の変数を同時に my宣言する

第 2引数では、入出力の方向を指定する第 3引数では、対象となるファイル名を指定する

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 11 / 44

Page 40: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

モダンな書き方

入出力の際には、openの第 1引数のスカラー変数を、ファイルハンドルとして指定する

いわゆる「間接ファイルハンドル」

入力while (<$input>) { ......

my $line = <$input>;

出力print {$output} "This is a line\n"; # 推奨されるprint $output "This is a line\n"; # 非推奨

print $output, "This is a line\n"; # カンマに注意

IO::Fileモジュールを利用すると次のように書ける$output->print("This is a line data\n");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 12 / 44

Page 41: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

モダンな書き方

入出力の際には、openの第 1引数のスカラー変数を、ファイルハンドルとして指定する

いわゆる「間接ファイルハンドル」入力while (<$input>) { ......

my $line = <$input>;

出力print {$output} "This is a line\n"; # 推奨されるprint $output "This is a line\n"; # 非推奨

print $output, "This is a line\n"; # カンマに注意

IO::Fileモジュールを利用すると次のように書ける$output->print("This is a line data\n");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 12 / 44

Page 42: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

モダンな書き方

入出力の際には、openの第 1引数のスカラー変数を、ファイルハンドルとして指定する

いわゆる「間接ファイルハンドル」入力while (<$input>) { ......

my $line = <$input>;

出力print {$output} "This is a line\n"; # 推奨されるprint $output "This is a line\n"; # 非推奨

print $output, "This is a line\n"; # カンマに注意

IO::Fileモジュールを利用すると次のように書ける$output->print("This is a line data\n");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 12 / 44

Page 43: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

モダンな書き方

入出力の際には、openの第 1引数のスカラー変数を、ファイルハンドルとして指定する

いわゆる「間接ファイルハンドル」入力while (<$input>) { ......

my $line = <$input>;

出力print {$output} "This is a line\n"; # 推奨されるprint $output "This is a line\n"; # 非推奨

print $output, "This is a line\n"; # カンマに注意

IO::Fileモジュールを利用すると次のように書ける$output->print("This is a line data\n");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 12 / 44

Page 44: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

ファイルハンドルと open 関数

モダンな書き方

入出力の際には、openの第 1引数のスカラー変数を、ファイルハンドルとして指定する

いわゆる「間接ファイルハンドル」入力while (<$input>) { ......

my $line = <$input>;

出力print {$output} "This is a line\n"; # 推奨されるprint $output "This is a line\n"; # 非推奨

print $output, "This is a line\n"; # カンマに注意

IO::Fileモジュールを利用すると次のように書ける$output->print("This is a line data\n");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 12 / 44

Page 45: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

リファレンス

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 13 / 44

Page 46: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

リファレンスとは?

リファレンス(reference)は、他のデータを指すデータ型である

スカラー型の一種

C言語のポインタに相当するものリファレンスを利用して、複雑なデータ構造を表現できる

連結リスト、木構造、グラフ etc.

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 14 / 44

Page 47: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

リファレンスとは?

リファレンス(reference)は、他のデータを指すデータ型である

スカラー型の一種

C言語のポインタに相当するもの

リファレンスを利用して、複雑なデータ構造を表現できる

連結リスト、木構造、グラフ etc.

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 14 / 44

Page 48: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

リファレンスとは?

リファレンス(reference)は、他のデータを指すデータ型である

スカラー型の一種

C言語のポインタに相当するものリファレンスを利用して、複雑なデータ構造を表現できる

連結リスト、木構造、グラフ etc.

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 14 / 44

Page 49: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

変数へのリファレンスを得る

変数の前に逆スラッシュをつけると、リファレンスが得られる

Cの単項&演算子に相当$scaler_ref = \$scalar; # スカラー

$array_ref = \@array; # 配列

$hash_ref = \%hash; # ハッシュ

$func_ref = \&function; # サブルーチン

$glob_ref = \*STDOUT; # グロブ

リファレンス値はスカラーとして扱える

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 15 / 44

Page 50: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

変数へのリファレンスを得る

変数の前に逆スラッシュをつけると、リファレンスが得られる

Cの単項&演算子に相当$scaler_ref = \$scalar; # スカラー

$array_ref = \@array; # 配列

$hash_ref = \%hash; # ハッシュ

$func_ref = \&function; # サブルーチン

$glob_ref = \*STDOUT; # グロブ

リファレンス値はスカラーとして扱える

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 15 / 44

Page 51: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

変数へのリファレンスを得る

変数の前に逆スラッシュをつけると、リファレンスが得られる

Cの単項&演算子に相当$scaler_ref = \$scalar; # スカラー

$array_ref = \@array; # 配列

$hash_ref = \%hash; # ハッシュ

$func_ref = \&function; # サブルーチン

$glob_ref = \*STDOUT; # グロブ

リファレンス値はスカラーとして扱える

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 15 / 44

Page 52: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

変数へのリファレンスを得る

変数の前に逆スラッシュをつけると、リファレンスが得られる

Cの単項&演算子に相当$scaler_ref = \$scalar; # スカラー

$array_ref = \@array; # 配列

$hash_ref = \%hash; # ハッシュ

$func_ref = \&function; # サブルーチン

$glob_ref = \*STDOUT; # グロブ

リファレンス値はスカラーとして扱える

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 15 / 44

Page 53: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

変数へのリファレンスを得る

変数の前に逆スラッシュをつけると、リファレンスが得られる

Cの単項&演算子に相当$scaler_ref = \$scalar; # スカラー

$array_ref = \@array; # 配列

$hash_ref = \%hash; # ハッシュ

$func_ref = \&function; # サブルーチン

$glob_ref = \*STDOUT; # グロブ

リファレンス値はスカラーとして扱える

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 15 / 44

Page 54: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

変数へのリファレンスを得る

変数の前に逆スラッシュをつけると、リファレンスが得られる

Cの単項&演算子に相当$scaler_ref = \$scalar; # スカラー

$array_ref = \@array; # 配列

$hash_ref = \%hash; # ハッシュ

$func_ref = \&function; # サブルーチン

$glob_ref = \*STDOUT; # グロブ

リファレンス値はスカラーとして扱える

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 15 / 44

Page 55: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

デリファレンス

リファレンスをたどって、指しているデータにアクセスすることをデリファレンス(dereference)という

Perlでは、変数の種別を表すプレフィクス文字$、@、%、&などを使う

Cでは単項の*によってデリファレンスを行う

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 16 / 44

Page 56: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

デリファレンス

リファレンスをたどって、指しているデータにアクセスすることをデリファレンス(dereference)というPerlでは、変数の種別を表すプレフィクス文字$、@、%、&などを使う

Cでは単項の*によってデリファレンスを行う

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 16 / 44

Page 57: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

スカラーのデリファレンス

デリファレンスした結果はその型の変数として扱える

スカラーへのリファレンスを取得$sref = \$x;

スカラー値にアクセスする$a = $$ref;

コード例my $x = 100;

my $sref = \$x; # スカラーリファレンスを$srefに代入

print "$$sref $x\n"; # 100 100 と表示$$sref += 5;

print "$$sref $x\n"; # 105 105 と表示

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 17 / 44

Page 58: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

スカラーのデリファレンス

デリファレンスした結果はその型の変数として扱えるスカラーへのリファレンスを取得$sref = \$x;

スカラー値にアクセスする$a = $$ref;

コード例my $x = 100;

my $sref = \$x; # スカラーリファレンスを$srefに代入

print "$$sref $x\n"; # 100 100 と表示$$sref += 5;

print "$$sref $x\n"; # 105 105 と表示

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 17 / 44

Page 59: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

スカラーのデリファレンス

デリファレンスした結果はその型の変数として扱えるスカラーへのリファレンスを取得$sref = \$x;

スカラー値にアクセスする$a = $$ref;

コード例my $x = 100;

my $sref = \$x; # スカラーリファレンスを$srefに代入

print "$$sref $x\n"; # 100 100 と表示$$sref += 5;

print "$$sref $x\n"; # 105 105 と表示

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 17 / 44

Page 60: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

スカラーのデリファレンス

デリファレンスした結果はその型の変数として扱えるスカラーへのリファレンスを取得$sref = \$x;

スカラー値にアクセスする$a = $$ref;

コード例my $x = 100;

my $sref = \$x; # スカラーリファレンスを$srefに代入

print "$$sref $x\n"; # 100 100 と表示$$sref += 5;

print "$$sref $x\n"; # 105 105 と表示

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 17 / 44

Page 61: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

配列のデリファレンス

配列へのリファレンスを取得する$array_ref = \@array;

配列全体にアクセス@s = @$array_ref;

配列の要素にアクセス$$array_ref[10] = 10;

foreach文で配列の要素を順に処理するforeach (@$array_ref) {

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44

Page 62: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

配列のデリファレンス

配列へのリファレンスを取得する$array_ref = \@array;

配列全体にアクセス@s = @$array_ref;

配列の要素にアクセス$$array_ref[10] = 10;

foreach文で配列の要素を順に処理するforeach (@$array_ref) {

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44

Page 63: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

配列のデリファレンス

配列へのリファレンスを取得する$array_ref = \@array;

配列全体にアクセス@s = @$array_ref;

配列の要素にアクセス$$array_ref[10] = 10;

foreach文で配列の要素を順に処理するforeach (@$array_ref) {

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44

Page 64: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

配列のデリファレンス

配列へのリファレンスを取得する$array_ref = \@array;

配列全体にアクセス@s = @$array_ref;

配列の要素にアクセス$$array_ref[10] = 10;

foreach文で配列の要素を順に処理するforeach (@$array_ref) {

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44

Page 65: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

配列のデリファレンス

配列へのリファレンスを取得する$array_ref = \@array;

配列全体にアクセス@s = @$array_ref;

配列の要素にアクセス$$array_ref[10] = 10;

foreach文で配列の要素を順に処理するforeach (@$array_ref) {

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44

Page 66: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

配列のデリファレンスの例

関数 compute sum: 配列リファレンスを受け取って、要素の和を返すsub compute_sum {

my ($aref) = @_; # リファレンスを$arefへ代入my $sum = 0;

foreach (@$aref) { # 配列をデリファレンス$sum += $_;

}

return $sum;

}

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 19 / 44

Page 67: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ハッシュのデリファレンス

ハッシュへのリファレンスを取得する$href = \%h;

ハッシュの要素にアクセス$x = $$href{’a’};

keys関数で、ハッシュのすべてのキーを取り出すforeach (keys %$href) {

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 20 / 44

Page 68: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ハッシュのデリファレンス

ハッシュへのリファレンスを取得する$href = \%h;

ハッシュの要素にアクセス$x = $$href{’a’};

keys関数で、ハッシュのすべてのキーを取り出すforeach (keys %$href) {

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 20 / 44

Page 69: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ハッシュのデリファレンス

ハッシュへのリファレンスを取得する$href = \%h;

ハッシュの要素にアクセス$x = $$href{’a’};

keys関数で、ハッシュのすべてのキーを取り出すforeach (keys %$href) {

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 20 / 44

Page 70: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ハッシュのデリファレンス

ハッシュへのリファレンスを取得する$href = \%h;

ハッシュの要素にアクセス$x = $$href{’a’};

keys関数で、ハッシュのすべてのキーを取り出すforeach (keys %$href) {

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 20 / 44

Page 71: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

サブルーチンのデリファレンス

コードレフ (coderef)とも呼ばれる

サブルーチンへのリファレンスを取得する$fref = \&func;

サブルーチンを呼び出す&$fref($param);

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 21 / 44

Page 72: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

サブルーチンのデリファレンス

コードレフ (coderef)とも呼ばれるサブルーチンへのリファレンスを取得する$fref = \&func;

サブルーチンを呼び出す&$fref($param);

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 21 / 44

Page 73: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

サブルーチンのデリファレンス

コードレフ (coderef)とも呼ばれるサブルーチンへのリファレンスを取得する$fref = \&func;

サブルーチンを呼び出す&$fref($param);

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 21 / 44

Page 74: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

デリファレンスの失敗

リファレンスの本来の型以外にデリファレンスしようとするとエラーになる$aref = \@array;

$$aref = 10;

Not a SCALAR reference at - line 7.

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 22 / 44

Page 75: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ref関数

引数がリファレンスなら真、そうでなければ偽を返す真の値は、リファレンスが指すものの種類を示す文字列

リファレンス REF

スカラー SCALAR

配列 ARRAY

ハッシュ HASH

サブルーチン CODE

型グロブ GLOB

オブジェクト 所属するクラス名

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 23 / 44

Page 76: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

リファレンスから文字列への変換

リファレンスは必要に応じて文字列に変換される

例えば print文の引数として使った場合具体的には「型名+16進表記のアドレス」となる

例:  CODE(0xbb5b48), HASH(0xbb59f8)

eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる文字列からリファレンスへの逆変換は不可

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44

Page 77: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

リファレンスから文字列への変換

リファレンスは必要に応じて文字列に変換される例えば print文の引数として使った場合

具体的には「型名+16進表記のアドレス」となる例:  CODE(0xbb5b48), HASH(0xbb59f8)

eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる文字列からリファレンスへの逆変換は不可

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44

Page 78: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

リファレンスから文字列への変換

リファレンスは必要に応じて文字列に変換される例えば print文の引数として使った場合

具体的には「型名+16進表記のアドレス」となる例:  CODE(0xbb5b48), HASH(0xbb59f8)

eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる文字列からリファレンスへの逆変換は不可

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44

Page 79: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

リファレンスから文字列への変換

リファレンスは必要に応じて文字列に変換される例えば print文の引数として使った場合

具体的には「型名+16進表記のアドレス」となる例:  CODE(0xbb5b48), HASH(0xbb59f8)

eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる

文字列からリファレンスへの逆変換は不可

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44

Page 80: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

リファレンスから文字列への変換

リファレンスは必要に応じて文字列に変換される例えば print文の引数として使った場合

具体的には「型名+16進表記のアドレス」となる例:  CODE(0xbb5b48), HASH(0xbb59f8)

eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる文字列からリファレンスへの逆変換は不可

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44

Page 81: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ブロックを使ったデリファレンス

変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置ける

ブロックは正しいリファレンス値を返さなければならないスカラーのデリファレンス${$sref}

関数を呼び出すこともできる@{&get_array_ref()}

${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44

Page 82: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ブロックを使ったデリファレンス

変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置けるブロックは正しいリファレンス値を返さなければならない

スカラーのデリファレンス${$sref}

関数を呼び出すこともできる@{&get_array_ref()}

${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44

Page 83: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ブロックを使ったデリファレンス

変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置けるブロックは正しいリファレンス値を返さなければならないスカラーのデリファレンス${$sref}

関数を呼び出すこともできる@{&get_array_ref()}

${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44

Page 84: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ブロックを使ったデリファレンス

変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置けるブロックは正しいリファレンス値を返さなければならないスカラーのデリファレンス${$sref}

関数を呼び出すこともできる@{&get_array_ref()}

${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44

Page 85: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

ブロックを使ったデリファレンス

変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置けるブロックは正しいリファレンス値を返さなければならないスカラーのデリファレンス${$sref}

関数を呼び出すこともできる@{&get_array_ref()}

${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44

Page 86: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

${$a[2]}と$$a[2]の違い

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 26 / 44

Page 87: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

->によるデリファレンス

$a->[3]は$$a[3]を表す

$h->{key}は$$h{key}を表す$f->($param)は&$f($param)を表す多次元配列を表現する

$a->[3]->[2]

->の両側が [],{}、()の場合、->を省略できる$a->[3]->[2]は$a->[2][3]と書ける

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 27 / 44

Page 88: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

->によるデリファレンス

$a->[3]は$$a[3]を表す$h->{key}は$$h{key}を表す

$f->($param)は&$f($param)を表す多次元配列を表現する

$a->[3]->[2]

->の両側が [],{}、()の場合、->を省略できる$a->[3]->[2]は$a->[2][3]と書ける

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 27 / 44

Page 89: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

->によるデリファレンス

$a->[3]は$$a[3]を表す$h->{key}は$$h{key}を表す$f->($param)は&$f($param)を表す

多次元配列を表現する$a->[3]->[2]

->の両側が [],{}、()の場合、->を省略できる$a->[3]->[2]は$a->[2][3]と書ける

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 27 / 44

Page 90: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

->によるデリファレンス

$a->[3]は$$a[3]を表す$h->{key}は$$h{key}を表す$f->($param)は&$f($param)を表す多次元配列を表現する

$a->[3]->[2]

->の両側が [],{}、()の場合、->を省略できる$a->[3]->[2]は$a->[2][3]と書ける

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 27 / 44

Page 91: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

->によるデリファレンス

$a->[3]は$$a[3]を表す$h->{key}は$$h{key}を表す$f->($param)は&$f($param)を表す多次元配列を表現する

$a->[3]->[2]

->の両側が [],{}、()の場合、->を省略できる$a->[3]->[2]は$a->[2][3]と書ける

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 27 / 44

Page 92: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

多次元配列のエミュレーション

$a[3][2][5]のように書けば、あたかも多次元配列のように使える

これは実際は$a[3]->[2]->[5]である$a->[3][2][5]との違いに注意

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 28 / 44

Page 93: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

多次元配列のエミュレーション

$a[3][2][5]のように書けば、あたかも多次元配列のように使えるこれは実際は$a[3]->[2]->[5]である

$a->[3][2][5]との違いに注意

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 28 / 44

Page 94: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

多次元配列のエミュレーション

$a[3][2][5]のように書けば、あたかも多次元配列のように使えるこれは実際は$a[3]->[2]->[5]である$a->[3][2][5]との違いに注意

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 28 / 44

Page 95: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

$a[2][1]と$a->[2][1]の違い

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 29 / 44

Page 96: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

無名配列、無名ハッシュの自動生成

Perlでは、配列の大きさを宣言する必要はない要素に値を代入すると、自動的に配列の領域が確保される

$a[2][3]のような多次元配列風記法でも同様に、自動的に無名配列、無名ハッシュが生成される$a[2][1] = 100を実行すると、下のような配列

の実体が確保される

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 30 / 44

Page 97: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

無名配列、無名ハッシュの自動生成

Perlでは、配列の大きさを宣言する必要はない要素に値を代入すると、自動的に配列の領域が確保される

$a[2][3]のような多次元配列風記法でも同様に、自動的に無名配列、無名ハッシュが生成される

$a[2][1] = 100を実行すると、下のような配列の実体が確保される

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 30 / 44

Page 98: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

リファレンス

無名配列、無名ハッシュの自動生成

Perlでは、配列の大きさを宣言する必要はない要素に値を代入すると、自動的に配列の領域が確保される

$a[2][3]のような多次元配列風記法でも同様に、自動的に無名配列、無名ハッシュが生成される$a[2][1] = 100を実行すると、下のような配列

の実体が確保される

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 30 / 44

Page 99: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

無名配列、無名ハッシュ

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 31 / 44

Page 100: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

配列リファレンスを取得するには

配列リファレンスを受け取る関数 compute sumを呼び出すmy @tmp_array = (1, 3, 5, 7, 9);

print "Total: ", compute_sum(\@tmp_array), "\n";

sub compute_sum {

my ($aref) = @_;

my $sum = 0;

foreach (@$aref) {

$sum += $_;

}

return $sum;

}

わざわざ配列@tmp arrayを用意するのは面倒くさい

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 32 / 44

Page 101: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

配列リファレンスを取得するには

配列リファレンスを受け取る関数 compute sumを呼び出すmy @tmp_array = (1, 3, 5, 7, 9);

print "Total: ", compute_sum(\@tmp_array), "\n";

sub compute_sum {

my ($aref) = @_;

my $sum = 0;

foreach (@$aref) {

$sum += $_;

}

return $sum;

}

わざわざ配列@tmp arrayを用意するのは面倒くさい

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 32 / 44

Page 102: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

無名配列

Perlは、無名配列 (anonymous array)がサポートしている

ブラケット []で要素を囲んで指定する無名の配列が生成されて、それへのリファレンスが返される

例)5要素の名前のない配列へのリファレンスを$arefに代入$aref = [1, 2, 3, 4, 5]

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 33 / 44

Page 103: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

無名配列

Perlは、無名配列 (anonymous array)がサポートしている

ブラケット []で要素を囲んで指定する無名の配列が生成されて、それへのリファレンスが返される

例)5要素の名前のない配列へのリファレンスを$arefに代入$aref = [1, 2, 3, 4, 5]

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 33 / 44

Page 104: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

無名配列

Perlは、無名配列 (anonymous array)がサポートしている

ブラケット []で要素を囲んで指定する無名の配列が生成されて、それへのリファレンスが返される

例)5要素の名前のない配列へのリファレンスを$arefに代入$aref = [1, 2, 3, 4, 5]

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 33 / 44

Page 105: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

無名配列

関数 compute sumを呼び出すprint "Total: ", compute_sum([1, 3, 5, 7, 9]), "\n";

リスト (1, 2, 3)と無名配列 [1, 2, 3]を混同しないこと

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 34 / 44

Page 106: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

無名配列

関数 compute sumを呼び出すprint "Total: ", compute_sum([1, 3, 5, 7, 9]), "\n";

リスト (1, 2, 3)と無名配列 [1, 2, 3]を混同しないこと

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 34 / 44

Page 107: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

無名ハッシュ

ハッシュに関しては、無名ハッシュ(anonymoushash)がある

ブレース{}で要素を囲んで指定する要素は「キー、値」のペアで指定する無名のハッシュが生成されて、それへのリファレンスが返される

例)キーと値のペアを 3個持った名前のないハッシュへのリファレンス$href = {one => 1, two => 2, three => 3};

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 35 / 44

Page 108: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

無名ハッシュ

ハッシュに関しては、無名ハッシュ(anonymoushash)がある

ブレース{}で要素を囲んで指定する要素は「キー、値」のペアで指定する無名のハッシュが生成されて、それへのリファレンスが返される

例)キーと値のペアを 3個持った名前のないハッシュへのリファレンス$href = {one => 1, two => 2, three => 3};

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 35 / 44

Page 109: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

ハッシュと=>

=>は太い矢印 (thick arrow)と呼ばれる (「初めてのPerl」p121)

基本的には、カンマと同じ意味=>の左側に英数字と下線のみの文字列 (先頭は数字以外)を置く場合、クォートを省略可

前ページの例$href = {one => 1, two => 2, three => 3};

カンマを使うと次のようになる$href = {’one’, 1, ’two’, 2, ’three’, 3 };

キーと値の対応が明確になるので、ハッシュを記述する場合には=>を使うのが普通(キーをクォートしないで済むので楽ちん)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 36 / 44

Page 110: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

ハッシュと=>

=>は太い矢印 (thick arrow)と呼ばれる (「初めてのPerl」p121)

基本的には、カンマと同じ意味

=>の左側に英数字と下線のみの文字列 (先頭は数字以外)を置く場合、クォートを省略可

前ページの例$href = {one => 1, two => 2, three => 3};

カンマを使うと次のようになる$href = {’one’, 1, ’two’, 2, ’three’, 3 };

キーと値の対応が明確になるので、ハッシュを記述する場合には=>を使うのが普通(キーをクォートしないで済むので楽ちん)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 36 / 44

Page 111: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

ハッシュと=>

=>は太い矢印 (thick arrow)と呼ばれる (「初めてのPerl」p121)

基本的には、カンマと同じ意味=>の左側に英数字と下線のみの文字列 (先頭は数字以外)を置く場合、クォートを省略可

前ページの例$href = {one => 1, two => 2, three => 3};

カンマを使うと次のようになる$href = {’one’, 1, ’two’, 2, ’three’, 3 };

キーと値の対応が明確になるので、ハッシュを記述する場合には=>を使うのが普通(キーをクォートしないで済むので楽ちん)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 36 / 44

Page 112: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

ハッシュと=>

=>は太い矢印 (thick arrow)と呼ばれる (「初めてのPerl」p121)

基本的には、カンマと同じ意味=>の左側に英数字と下線のみの文字列 (先頭は数字以外)を置く場合、クォートを省略可

前ページの例$href = {one => 1, two => 2, three => 3};

カンマを使うと次のようになる$href = {’one’, 1, ’two’, 2, ’three’, 3 };

キーと値の対応が明確になるので、ハッシュを記述する場合には=>を使うのが普通(キーをクォートしないで済むので楽ちん)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 36 / 44

Page 113: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

ハッシュと=>

=>は太い矢印 (thick arrow)と呼ばれる (「初めてのPerl」p121)

基本的には、カンマと同じ意味=>の左側に英数字と下線のみの文字列 (先頭は数字以外)を置く場合、クォートを省略可

前ページの例$href = {one => 1, two => 2, three => 3};

カンマを使うと次のようになる$href = {’one’, 1, ’two’, 2, ’three’, 3 };

キーと値の対応が明確になるので、ハッシュを記述する場合には=>を使うのが普通(キーをクォートしないで済むので楽ちん)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 36 / 44

Page 114: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

ハッシュと=>

=>は太い矢印 (thick arrow)と呼ばれる (「初めてのPerl」p121)

基本的には、カンマと同じ意味=>の左側に英数字と下線のみの文字列 (先頭は数字以外)を置く場合、クォートを省略可

前ページの例$href = {one => 1, two => 2, three => 3};

カンマを使うと次のようになる$href = {’one’, 1, ’two’, 2, ’three’, 3 };

キーと値の対応が明確になるので、ハッシュを記述する場合には=>を使うのが普通

(キーをクォートしないで済むので楽ちん)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 36 / 44

Page 115: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

ハッシュと=>

=>は太い矢印 (thick arrow)と呼ばれる (「初めてのPerl」p121)

基本的には、カンマと同じ意味=>の左側に英数字と下線のみの文字列 (先頭は数字以外)を置く場合、クォートを省略可

前ページの例$href = {one => 1, two => 2, three => 3};

カンマを使うと次のようになる$href = {’one’, 1, ’two’, 2, ’three’, 3 };

キーと値の対応が明確になるので、ハッシュを記述する場合には=>を使うのが普通(キーをクォートしないで済むので楽ちん)

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 36 / 44

Page 116: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

無名配列と無名ハッシュを組み合わせる

自由に組み合わせることができる。(C風の)構造体やオブジェクトを表現するのに無名ハッシュを使うのが定石my $userinfo = { name => $name,

uid => $uid,

gid => [1, 200, 201, 203],

env => {

HOME => $ENV{HOME},

TERM => "VT100" } };

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 37 / 44

Page 117: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

Data::Dumperモジュール

リファレンスで複雑なデータ構造を作れるのはいいけど、表示するにはどうするの?

単にプリントすると HASH(0x116360)そこでData::Dumperモジュールの出番です。$VAR1 = {

’uid’ => 1001,

’env’ => {

’HOME’ => ’/home/cond’,

’TERM’ => ’VT100’

},

’name’ => ’John’,

’gid’ => [

1,

200,

201,

203

]

};

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 38 / 44

Page 118: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

Data::Dumperモジュール

リファレンスで複雑なデータ構造を作れるのはいいけど、表示するにはどうするの?単にプリントすると HASH(0x116360)

そこでData::Dumperモジュールの出番です。$VAR1 = {

’uid’ => 1001,

’env’ => {

’HOME’ => ’/home/cond’,

’TERM’ => ’VT100’

},

’name’ => ’John’,

’gid’ => [

1,

200,

201,

203

]

};

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 38 / 44

Page 119: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名配列、無名ハッシュ

Data::Dumperモジュール

リファレンスで複雑なデータ構造を作れるのはいいけど、表示するにはどうするの?単にプリントすると HASH(0x116360)そこでData::Dumperモジュールの出番です。$VAR1 = {

’uid’ => 1001,

’env’ => {

’HOME’ => ’/home/cond’,

’TERM’ => ’VT100’

},

’name’ => ’John’,

’gid’ => [

1,

200,

201,

203

]

};

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 38 / 44

Page 120: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

無名サブルーチン (コードレフ)、クロージャ

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 39 / 44

Page 121: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

無名サブルーチン

Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている

sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される

無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }

無名サブルーチンを呼び出す&$fref("world");

->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44

Page 122: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

無名サブルーチン

Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている

sub { ..... }と書く

無名のサブルーチンが生成されて、それへのリファレンスが返される

無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }

無名サブルーチンを呼び出す&$fref("world");

->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44

Page 123: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

無名サブルーチン

Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている

sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される

無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }

無名サブルーチンを呼び出す&$fref("world");

->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44

Page 124: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

無名サブルーチン

Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている

sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される

無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }

無名サブルーチンを呼び出す&$fref("world");

->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44

Page 125: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

無名サブルーチン

Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている

sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される

無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }

無名サブルーチンを呼び出す&$fref("world");

->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44

Page 126: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

無名サブルーチン

Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている

sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される

無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }

無名サブルーチンを呼び出す&$fref("world");

->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44

Page 127: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

クロージャ

クロージャ(closure)とは?無名サブルーチンを生成する際に、その時点で見えるレキシカル変数 (my変数)の実体も閉じ込められる。これをクロージャと言う。

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 41 / 44

Page 128: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

関数adder: 指定した数を加算して返す関数を返す

sub adder {

my ($increment) = @_; # この変数が閉じ込められる

return sub {

my ($x) = @_;

return $x + $increment;

}

}

my $add1 = adder(1); # 1を加算する関数my $add20 = adder(20); # 20を加算する関数

print $add1->(10), "\n"; # 11

print $add20->(10), "\n"; # 30

print $add1->(30), "\n"; # 31

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 42 / 44

Page 129: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

関数make counter: カウンタ関数を返す

sub make_counter {

my ($counter) = @_; # この変数が閉じ込められる

return sub { return ++$counter };

}

my $foo = make_counter(0); # 初期値 0のカウンタmy $bar = make_counter(100); # 初期値 100のカウンタ

print $foo->(), "\n"; # 1

print $bar->(), "\n"; # 101

print $bar->(), "\n"; # 102

print $foo->(), "\n"; # 2

print $bar->(), "\n"; # 103

print $foo->(), "\n"; # 3

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 43 / 44

Page 130: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

良い子のお約束

スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 44 / 44

Page 131: Perl中級者への道 (近藤 嘉雪, at PerlCasual #4)

無名サブルーチン (コードレフ)、クロージャ

良い子のお約束

スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと

近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 44 / 44