perl中級者への道 (近藤 嘉雪, at perlcasual #4)
DESCRIPTION
PerlCasual #4 (2011/4/28, 池袋ジュンク堂)で行ったトークのスライドです。 動画をYouTubeで公開しているので、あわせてご覧ください。http://youtu.be/kLt2aYN7UYE, http://youtu.be/xVC9pqCe8cETRANSCRIPT
.
.. ..
.
.
Perl中級者への道
近藤嘉雪
@yoshiyuki kondo
PerlCasual #4 (2011/4/28)
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 1 / 44
自己紹介
近藤嘉雪 (こんどうよしゆき)
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
自己紹介
近藤嘉雪 (こんどうよしゆき)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
自己紹介
近藤嘉雪 (こんどうよしゆき)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
自己紹介
近藤嘉雪 (こんどうよしゆき)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
自己紹介
近藤嘉雪 (こんどうよしゆき)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
自己紹介
近藤嘉雪 (こんどうよしゆき)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
自己紹介
近藤嘉雪 (こんどうよしゆき)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
自己紹介
近藤嘉雪 (こんどうよしゆき)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
自己紹介
近藤嘉雪 (こんどうよしゆき)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
はじめに
はじめに
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 3 / 44
はじめに
中級者への道
Perlは敷居の低い、とっつきやすい言語です。でも、奥もとっても深い言語です。「初めてのPerl」を読み終えた後に、中級者を目指すには、どんなこと知識が必要かを紹介します。
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 4 / 44
はじめに
中級者への道
Perlは敷居の低い、とっつきやすい言語です。
でも、奥もとっても深い言語です。「初めてのPerl」を読み終えた後に、中級者を目指すには、どんなこと知識が必要かを紹介します。
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 4 / 44
はじめに
中級者への道
Perlは敷居の低い、とっつきやすい言語です。でも、奥もとっても深い言語です。
「初めてのPerl」を読み終えた後に、中級者を目指すには、どんなこと知識が必要かを紹介します。
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 4 / 44
はじめに
中級者への道
Perlは敷居の低い、とっつきやすい言語です。でも、奥もとっても深い言語です。「初めてのPerl」を読み終えた後に、中級者を目指すには、どんなこと知識が必要かを紹介します。
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 4 / 44
はじめに
良い子のお約束
スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと
#!/usr/bin/perl
use strict;
use warnings;
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 5 / 44
はじめに
良い子のお約束
スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと
#!/usr/bin/perl
use strict;
use warnings;
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 5 / 44
はじめに
良い子のお約束
スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと
#!/usr/bin/perl
use strict;
use warnings;
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 5 / 44
はじめに
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
はじめに
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
はじめに
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
はじめに
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
はじめに
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
はじめに
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
はじめに
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
はじめに
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
はじめに
良い子のお約束
#!/usr/bin/perl
use strict;
use warnings;
いわゆるポカミスを見つけてくれる
絶対に指定すること!!
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 8 / 44
はじめに
良い子のお約束
#!/usr/bin/perl
use strict;
use warnings;
いわゆるポカミスを見つけてくれる
絶対に指定すること!!
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 8 / 44
はじめに
良い子のお約束
#!/usr/bin/perl
use strict;
use warnings;
いわゆるポカミスを見つけてくれる
絶対に指定すること!!
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 8 / 44
はじめに
良い子のお約束
#!/usr/bin/perl
use strict;
use warnings;
いわゆるポカミスを見つけてくれる
絶対に指定すること!!
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 8 / 44
ファイルハンドルと open 関数
ファイルハンドルとopen関数
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 9 / 44
ファイルハンドルと 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
ファイルハンドルと 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
ファイルハンドルと 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
ファイルハンドルと 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
ファイルハンドルと open 関数
モダンな書き方
3引数の open関数を使うopen my $input, "<", "mydata"
第 1引数で指定したスカラー変数に、ファイルハンドルが格納される
通常はこの例のように、第 1引数の変数を同時に my宣言する
第 2引数では、入出力の方向を指定する第 3引数では、対象となるファイル名を指定する
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 11 / 44
ファイルハンドルと open 関数
モダンな書き方
3引数の open関数を使うopen my $input, "<", "mydata"
第 1引数で指定したスカラー変数に、ファイルハンドルが格納される
通常はこの例のように、第 1引数の変数を同時に my宣言する
第 2引数では、入出力の方向を指定する第 3引数では、対象となるファイル名を指定する
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 11 / 44
ファイルハンドルと open 関数
モダンな書き方
3引数の open関数を使うopen my $input, "<", "mydata"
第 1引数で指定したスカラー変数に、ファイルハンドルが格納される
通常はこの例のように、第 1引数の変数を同時に my宣言する
第 2引数では、入出力の方向を指定する
第 3引数では、対象となるファイル名を指定する
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 11 / 44
ファイルハンドルと open 関数
モダンな書き方
3引数の open関数を使うopen my $input, "<", "mydata"
第 1引数で指定したスカラー変数に、ファイルハンドルが格納される
通常はこの例のように、第 1引数の変数を同時に my宣言する
第 2引数では、入出力の方向を指定する第 3引数では、対象となるファイル名を指定する
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 11 / 44
ファイルハンドルと 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
ファイルハンドルと 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
ファイルハンドルと 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
ファイルハンドルと 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
ファイルハンドルと 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
リファレンス
リファレンス
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 13 / 44
リファレンス
リファレンスとは?
リファレンス(reference)は、他のデータを指すデータ型である
スカラー型の一種
C言語のポインタに相当するものリファレンスを利用して、複雑なデータ構造を表現できる
連結リスト、木構造、グラフ etc.
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 14 / 44
リファレンス
リファレンスとは?
リファレンス(reference)は、他のデータを指すデータ型である
スカラー型の一種
C言語のポインタに相当するもの
リファレンスを利用して、複雑なデータ構造を表現できる
連結リスト、木構造、グラフ etc.
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 14 / 44
リファレンス
リファレンスとは?
リファレンス(reference)は、他のデータを指すデータ型である
スカラー型の一種
C言語のポインタに相当するものリファレンスを利用して、複雑なデータ構造を表現できる
連結リスト、木構造、グラフ etc.
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 14 / 44
リファレンス
変数へのリファレンスを得る
変数の前に逆スラッシュをつけると、リファレンスが得られる
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
リファレンス
変数へのリファレンスを得る
変数の前に逆スラッシュをつけると、リファレンスが得られる
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
リファレンス
変数へのリファレンスを得る
変数の前に逆スラッシュをつけると、リファレンスが得られる
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
リファレンス
変数へのリファレンスを得る
変数の前に逆スラッシュをつけると、リファレンスが得られる
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
リファレンス
変数へのリファレンスを得る
変数の前に逆スラッシュをつけると、リファレンスが得られる
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
リファレンス
変数へのリファレンスを得る
変数の前に逆スラッシュをつけると、リファレンスが得られる
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
リファレンス
デリファレンス
リファレンスをたどって、指しているデータにアクセスすることをデリファレンス(dereference)という
Perlでは、変数の種別を表すプレフィクス文字$、@、%、&などを使う
Cでは単項の*によってデリファレンスを行う
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 16 / 44
リファレンス
デリファレンス
リファレンスをたどって、指しているデータにアクセスすることをデリファレンス(dereference)というPerlでは、変数の種別を表すプレフィクス文字$、@、%、&などを使う
Cでは単項の*によってデリファレンスを行う
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 16 / 44
リファレンス
スカラーのデリファレンス
デリファレンスした結果はその型の変数として扱える
スカラーへのリファレンスを取得$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
リファレンス
スカラーのデリファレンス
デリファレンスした結果はその型の変数として扱えるスカラーへのリファレンスを取得$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
リファレンス
スカラーのデリファレンス
デリファレンスした結果はその型の変数として扱えるスカラーへのリファレンスを取得$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
リファレンス
スカラーのデリファレンス
デリファレンスした結果はその型の変数として扱えるスカラーへのリファレンスを取得$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
リファレンス
配列のデリファレンス
配列へのリファレンスを取得する$array_ref = \@array;
配列全体にアクセス@s = @$array_ref;
配列の要素にアクセス$$array_ref[10] = 10;
foreach文で配列の要素を順に処理するforeach (@$array_ref) {
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44
リファレンス
配列のデリファレンス
配列へのリファレンスを取得する$array_ref = \@array;
配列全体にアクセス@s = @$array_ref;
配列の要素にアクセス$$array_ref[10] = 10;
foreach文で配列の要素を順に処理するforeach (@$array_ref) {
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44
リファレンス
配列のデリファレンス
配列へのリファレンスを取得する$array_ref = \@array;
配列全体にアクセス@s = @$array_ref;
配列の要素にアクセス$$array_ref[10] = 10;
foreach文で配列の要素を順に処理するforeach (@$array_ref) {
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44
リファレンス
配列のデリファレンス
配列へのリファレンスを取得する$array_ref = \@array;
配列全体にアクセス@s = @$array_ref;
配列の要素にアクセス$$array_ref[10] = 10;
foreach文で配列の要素を順に処理するforeach (@$array_ref) {
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44
リファレンス
配列のデリファレンス
配列へのリファレンスを取得する$array_ref = \@array;
配列全体にアクセス@s = @$array_ref;
配列の要素にアクセス$$array_ref[10] = 10;
foreach文で配列の要素を順に処理するforeach (@$array_ref) {
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 18 / 44
リファレンス
配列のデリファレンスの例
関数 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
リファレンス
ハッシュのデリファレンス
ハッシュへのリファレンスを取得する$href = \%h;
ハッシュの要素にアクセス$x = $$href{’a’};
keys関数で、ハッシュのすべてのキーを取り出すforeach (keys %$href) {
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 20 / 44
リファレンス
ハッシュのデリファレンス
ハッシュへのリファレンスを取得する$href = \%h;
ハッシュの要素にアクセス$x = $$href{’a’};
keys関数で、ハッシュのすべてのキーを取り出すforeach (keys %$href) {
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 20 / 44
リファレンス
ハッシュのデリファレンス
ハッシュへのリファレンスを取得する$href = \%h;
ハッシュの要素にアクセス$x = $$href{’a’};
keys関数で、ハッシュのすべてのキーを取り出すforeach (keys %$href) {
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 20 / 44
リファレンス
ハッシュのデリファレンス
ハッシュへのリファレンスを取得する$href = \%h;
ハッシュの要素にアクセス$x = $$href{’a’};
keys関数で、ハッシュのすべてのキーを取り出すforeach (keys %$href) {
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 20 / 44
リファレンス
サブルーチンのデリファレンス
コードレフ (coderef)とも呼ばれる
サブルーチンへのリファレンスを取得する$fref = \&func;
サブルーチンを呼び出す&$fref($param);
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 21 / 44
リファレンス
サブルーチンのデリファレンス
コードレフ (coderef)とも呼ばれるサブルーチンへのリファレンスを取得する$fref = \&func;
サブルーチンを呼び出す&$fref($param);
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 21 / 44
リファレンス
サブルーチンのデリファレンス
コードレフ (coderef)とも呼ばれるサブルーチンへのリファレンスを取得する$fref = \&func;
サブルーチンを呼び出す&$fref($param);
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 21 / 44
リファレンス
デリファレンスの失敗
リファレンスの本来の型以外にデリファレンスしようとするとエラーになる$aref = \@array;
$$aref = 10;
Not a SCALAR reference at - line 7.
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 22 / 44
リファレンス
ref関数
引数がリファレンスなら真、そうでなければ偽を返す真の値は、リファレンスが指すものの種類を示す文字列
リファレンス REF
スカラー SCALAR
配列 ARRAY
ハッシュ HASH
サブルーチン CODE
型グロブ GLOB
オブジェクト 所属するクラス名
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 23 / 44
リファレンス
リファレンスから文字列への変換
リファレンスは必要に応じて文字列に変換される
例えば print文の引数として使った場合具体的には「型名+16進表記のアドレス」となる
例: CODE(0xbb5b48), HASH(0xbb59f8)
eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる文字列からリファレンスへの逆変換は不可
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44
リファレンス
リファレンスから文字列への変換
リファレンスは必要に応じて文字列に変換される例えば print文の引数として使った場合
具体的には「型名+16進表記のアドレス」となる例: CODE(0xbb5b48), HASH(0xbb59f8)
eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる文字列からリファレンスへの逆変換は不可
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44
リファレンス
リファレンスから文字列への変換
リファレンスは必要に応じて文字列に変換される例えば print文の引数として使った場合
具体的には「型名+16進表記のアドレス」となる例: CODE(0xbb5b48), HASH(0xbb59f8)
eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる文字列からリファレンスへの逆変換は不可
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44
リファレンス
リファレンスから文字列への変換
リファレンスは必要に応じて文字列に変換される例えば print文の引数として使った場合
具体的には「型名+16進表記のアドレス」となる例: CODE(0xbb5b48), HASH(0xbb59f8)
eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる
文字列からリファレンスへの逆変換は不可
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44
リファレンス
リファレンスから文字列への変換
リファレンスは必要に応じて文字列に変換される例えば print文の引数として使った場合
具体的には「型名+16進表記のアドレス」となる例: CODE(0xbb5b48), HASH(0xbb59f8)
eq演算子を使って、リファレンスの等価性(=同じものを指す)をチェックできる文字列からリファレンスへの逆変換は不可
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 24 / 44
リファレンス
ブロックを使ったデリファレンス
変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置ける
ブロックは正しいリファレンス値を返さなければならないスカラーのデリファレンス${$sref}
関数を呼び出すこともできる@{&get_array_ref()}
${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44
リファレンス
ブロックを使ったデリファレンス
変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置けるブロックは正しいリファレンス値を返さなければならない
スカラーのデリファレンス${$sref}
関数を呼び出すこともできる@{&get_array_ref()}
${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44
リファレンス
ブロックを使ったデリファレンス
変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置けるブロックは正しいリファレンス値を返さなければならないスカラーのデリファレンス${$sref}
関数を呼び出すこともできる@{&get_array_ref()}
${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44
リファレンス
ブロックを使ったデリファレンス
変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置けるブロックは正しいリファレンス値を返さなければならないスカラーのデリファレンス${$sref}
関数を呼び出すこともできる@{&get_array_ref()}
${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44
リファレンス
ブロックを使ったデリファレンス
変数名やサブルーチン名のうち、英数字の識別子の変わりにブロックを置けるブロックは正しいリファレンス値を返さなければならないスカラーのデリファレンス${$sref}
関数を呼び出すこともできる@{&get_array_ref()}
${$a[2]}と$$a[2]の違いに注意$$a[2]は${$a}[2]と解釈される
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 25 / 44
リファレンス
${$a[2]}と$$a[2]の違い
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 26 / 44
リファレンス
->によるデリファレンス
$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
リファレンス
->によるデリファレンス
$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
リファレンス
->によるデリファレンス
$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
リファレンス
->によるデリファレンス
$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
リファレンス
->によるデリファレンス
$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
リファレンス
多次元配列のエミュレーション
$a[3][2][5]のように書けば、あたかも多次元配列のように使える
これは実際は$a[3]->[2]->[5]である$a->[3][2][5]との違いに注意
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 28 / 44
リファレンス
多次元配列のエミュレーション
$a[3][2][5]のように書けば、あたかも多次元配列のように使えるこれは実際は$a[3]->[2]->[5]である
$a->[3][2][5]との違いに注意
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 28 / 44
リファレンス
多次元配列のエミュレーション
$a[3][2][5]のように書けば、あたかも多次元配列のように使えるこれは実際は$a[3]->[2]->[5]である$a->[3][2][5]との違いに注意
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 28 / 44
リファレンス
$a[2][1]と$a->[2][1]の違い
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 29 / 44
リファレンス
無名配列、無名ハッシュの自動生成
Perlでは、配列の大きさを宣言する必要はない要素に値を代入すると、自動的に配列の領域が確保される
$a[2][3]のような多次元配列風記法でも同様に、自動的に無名配列、無名ハッシュが生成される$a[2][1] = 100を実行すると、下のような配列
の実体が確保される
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 30 / 44
リファレンス
無名配列、無名ハッシュの自動生成
Perlでは、配列の大きさを宣言する必要はない要素に値を代入すると、自動的に配列の領域が確保される
$a[2][3]のような多次元配列風記法でも同様に、自動的に無名配列、無名ハッシュが生成される
$a[2][1] = 100を実行すると、下のような配列の実体が確保される
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 30 / 44
リファレンス
無名配列、無名ハッシュの自動生成
Perlでは、配列の大きさを宣言する必要はない要素に値を代入すると、自動的に配列の領域が確保される
$a[2][3]のような多次元配列風記法でも同様に、自動的に無名配列、無名ハッシュが生成される$a[2][1] = 100を実行すると、下のような配列
の実体が確保される
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 30 / 44
無名配列、無名ハッシュ
無名配列、無名ハッシュ
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 31 / 44
無名配列、無名ハッシュ
配列リファレンスを取得するには
配列リファレンスを受け取る関数 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
無名配列、無名ハッシュ
配列リファレンスを取得するには
配列リファレンスを受け取る関数 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
無名配列、無名ハッシュ
無名配列
Perlは、無名配列 (anonymous array)がサポートしている
ブラケット []で要素を囲んで指定する無名の配列が生成されて、それへのリファレンスが返される
例)5要素の名前のない配列へのリファレンスを$arefに代入$aref = [1, 2, 3, 4, 5]
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 33 / 44
無名配列、無名ハッシュ
無名配列
Perlは、無名配列 (anonymous array)がサポートしている
ブラケット []で要素を囲んで指定する無名の配列が生成されて、それへのリファレンスが返される
例)5要素の名前のない配列へのリファレンスを$arefに代入$aref = [1, 2, 3, 4, 5]
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 33 / 44
無名配列、無名ハッシュ
無名配列
Perlは、無名配列 (anonymous array)がサポートしている
ブラケット []で要素を囲んで指定する無名の配列が生成されて、それへのリファレンスが返される
例)5要素の名前のない配列へのリファレンスを$arefに代入$aref = [1, 2, 3, 4, 5]
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 33 / 44
無名配列、無名ハッシュ
無名配列
関数 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
無名配列、無名ハッシュ
無名配列
関数 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
無名配列、無名ハッシュ
無名ハッシュ
ハッシュに関しては、無名ハッシュ(anonymoushash)がある
ブレース{}で要素を囲んで指定する要素は「キー、値」のペアで指定する無名のハッシュが生成されて、それへのリファレンスが返される
例)キーと値のペアを 3個持った名前のないハッシュへのリファレンス$href = {one => 1, two => 2, three => 3};
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 35 / 44
無名配列、無名ハッシュ
無名ハッシュ
ハッシュに関しては、無名ハッシュ(anonymoushash)がある
ブレース{}で要素を囲んで指定する要素は「キー、値」のペアで指定する無名のハッシュが生成されて、それへのリファレンスが返される
例)キーと値のペアを 3個持った名前のないハッシュへのリファレンス$href = {one => 1, two => 2, three => 3};
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 35 / 44
無名配列、無名ハッシュ
ハッシュと=>
=>は太い矢印 (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
無名配列、無名ハッシュ
ハッシュと=>
=>は太い矢印 (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
無名配列、無名ハッシュ
ハッシュと=>
=>は太い矢印 (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
無名配列、無名ハッシュ
ハッシュと=>
=>は太い矢印 (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
無名配列、無名ハッシュ
ハッシュと=>
=>は太い矢印 (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
無名配列、無名ハッシュ
ハッシュと=>
=>は太い矢印 (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
無名配列、無名ハッシュ
ハッシュと=>
=>は太い矢印 (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
無名配列、無名ハッシュ
無名配列と無名ハッシュを組み合わせる
自由に組み合わせることができる。(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
無名配列、無名ハッシュ
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
無名配列、無名ハッシュ
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
無名配列、無名ハッシュ
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
無名サブルーチン (コードレフ)、クロージャ
無名サブルーチン (コードレフ)、クロージャ
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 39 / 44
無名サブルーチン (コードレフ)、クロージャ
無名サブルーチン
Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている
sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される
無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }
無名サブルーチンを呼び出す&$fref("world");
->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44
無名サブルーチン (コードレフ)、クロージャ
無名サブルーチン
Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている
sub { ..... }と書く
無名のサブルーチンが生成されて、それへのリファレンスが返される
無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }
無名サブルーチンを呼び出す&$fref("world");
->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44
無名サブルーチン (コードレフ)、クロージャ
無名サブルーチン
Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている
sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される
無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }
無名サブルーチンを呼び出す&$fref("world");
->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44
無名サブルーチン (コードレフ)、クロージャ
無名サブルーチン
Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている
sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される
無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }
無名サブルーチンを呼び出す&$fref("world");
->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44
無名サブルーチン (コードレフ)、クロージャ
無名サブルーチン
Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている
sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される
無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }
無名サブルーチンを呼び出す&$fref("world");
->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44
無名サブルーチン (コードレフ)、クロージャ
無名サブルーチン
Perlは、無名サブルーチン(anonymoussubroutine)をサポートしている
sub { ..... }と書く無名のサブルーチンが生成されて、それへのリファレンスが返される
無名サブルーチンのリファレンスを frefに代入$fref = sub { print "Hello, $_[0]\n"; }
無名サブルーチンを呼び出す&$fref("world");
->を使って、無名サブルーチンを呼び出す (こちらの書き方が好まれる)$fref->("world");
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 40 / 44
無名サブルーチン (コードレフ)、クロージャ
クロージャ
クロージャ(closure)とは?無名サブルーチンを生成する際に、その時点で見えるレキシカル変数 (my変数)の実体も閉じ込められる。これをクロージャと言う。
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 41 / 44
無名サブルーチン (コードレフ)、クロージャ
関数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
無名サブルーチン (コードレフ)、クロージャ
関数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
無名サブルーチン (コードレフ)、クロージャ
良い子のお約束
スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 44 / 44
無名サブルーチン (コードレフ)、クロージャ
良い子のお約束
スクリプトの冒頭に、必ずuse strictとuse warningsを置くこと
近藤嘉雪 (@yoshiyuki kondo) Perl 中級者への道 PerlCasual #4 (2011/4/28) 44 / 44