Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
.     Perl の勘所をマスターしよう!.  コンテキストとリファレンスを我が物に!                                      近藤 嘉雪                                  ...
自己紹介      近藤 嘉雪 (こんどう よしゆき)近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   2 / 57
自己紹介      近藤 嘉雪 (こんどう よしゆき)      Twitter: @yoshiyuki_kondo近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012...
自己紹介      近藤 嘉雪 (こんどう よしゆき)      Twitter: @yoshiyuki_kondo      ホームページ               http://www.kondoyoshiyuki.com/近藤 嘉雪 (...
自己紹介      近藤 嘉雪 (こんどう よしゆき)      Twitter: @yoshiyuki_kondo      ホームページ               http://www.kondoyoshiyuki.com/      訳...
自己紹介      近藤 嘉雪 (こんどう よしゆき)      Twitter: @yoshiyuki_kondo      ホームページ               http://www.kondoyoshiyuki.com/      訳...
自己紹介      近藤 嘉雪 (こんどう よしゆき)      Twitter: @yoshiyuki_kondo      ホームページ               http://www.kondoyoshiyuki.com/      訳...
好きなもの:近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   3 / 57
好きなもの:      エディタ:近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   3 / 57
好きなもの:      エディタ:               Emacs近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   3 / 57
好きなもの:      エディタ:               Emacs      日本語入力方式:近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/...
好きなもの:      エディタ:               Emacs      日本語入力方式:               T-Code (2 ストローク直接入力)近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリフ...
本日お話する内容近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   4 / 57
本日お話する内容      コンテキスト近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   4 / 57
本日お話する内容      コンテキスト      リファレンス近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   4 / 57
本日お話する内容      コンテキスト      リファレンス      以上近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   4 /...
コンテキストの話近藤 嘉雪 (@yoshiyuki kondo)    コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   5 / 57
コンテキストとは?      式を評価する際に、スカラー値とリスト値のどち      らを期待しているか、ということ近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012...
コンテキストとは?      式を評価する際に、スカラー値とリスト値のどち      らを期待しているか、ということ      スカラーコンテキストはスカラー値を期待近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレン...
コンテキストとは?      式を評価する際に、スカラー値とリスト値のどち      らを期待しているか、ということ      スカラーコンテキストはスカラー値を期待      リストコンテキストはリスト値を期待近藤 嘉雪 (@yoshiyuk...
コンテキストとは?      式を評価する際に、スカラー値とリスト値のどち      らを期待しているか、ということ      スカラーコンテキストはスカラー値を期待      リストコンテキストはリスト値を期待      「スカラー変数への代...
コンテキストとは?      式を評価する際に、スカラー値とリスト値のどち      らを期待しているか、ということ      スカラーコンテキストはスカラー値を期待      リストコンテキストはリスト値を期待      「スカラー変数への代...
ほかのコンテキスト (1)      無効コンテキスト (void context)近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   7...
ほかのコンテキスト (1)      無効コンテキスト (void context)               値を必要としない場所近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::...
ほかのコンテキスト (1)      無効コンテキスト (void context)               値を必要としない場所               use warnings;               my $a = 100;...
ほかのコンテキスト (2)      スカラーコンテキストはさらに分類される近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   8 / 57
ほかのコンテキスト (2)      スカラーコンテキストはさらに分類される      文字列コンテキスト (string context)               . 演算子、x の左側、ne、lt など近藤 嘉雪 (@yoshiyuki...
ほかのコンテキスト (2)      スカラーコンテキストはさらに分類される      文字列コンテキスト (string context)               . 演算子、x の左側、ne、lt など      数値コンテキスト (n...
ほかのコンテキスト (2)      スカラーコンテキストはさらに分類される      文字列コンテキスト (string context)               . 演算子、x の左側、ne、lt など      数値コンテキスト (n...
ほかのコンテキスト (2)      スカラーコンテキストはさらに分類される      文字列コンテキスト (string context)               . 演算子、x の左側、ne、lt など      数値コンテキスト (n...
リストコンテキストを与える場所 (1)近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   9 / 57
リストコンテキストを与える場所 (1)      配列変数、ハッシュ変数、リスト、スライスへの      代入の右辺      $x              =    func();   #   スカラーコンテキスト      @a     ...
リストコンテキストを与える場所 (1)      配列変数、ハッシュ変数、リスト、スライスへの      代入の右辺      $x              =    func();   #   スカラーコンテキスト      @a     ...
リストコンテキストを与える場所 (1)      配列変数、ハッシュ変数、リスト、スライスへの      代入の右辺      $x              =    func();   #   スカラーコンテキスト      @a     ...
リストコンテキストを与える場所 (1)      配列変数、ハッシュ変数、リスト、スライスへの      代入の右辺      $x              =    func();   #   スカラーコンテキスト      @a     ...
リストコンテキストを与える場所 (1)      配列変数、ハッシュ変数、リスト、スライスへの      代入の右辺      $x              =    func();   #   スカラーコンテキスト      @a     ...
リストコンテキストを与える場所 (2)近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   10 / 57
リストコンテキストを与える場所 (2)      リストコンテキスト以外の場所はスカラーコンテ      キストとなる近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 201...
リストコンテキストを与える場所 (2)      リストコンテキスト以外の場所はスカラーコンテ      キストとなる      scalar 関数によって、強制的にスカラーコンテキ      ストを適用できる近藤 嘉雪 (@yoshiyuki...
リストコンテキストを与える場所 (2)      リストコンテキスト以外の場所はスカラーコンテ      キストとなる      scalar 関数によって、強制的にスカラーコンテキ      ストを適用できる      my や our 宣言...
リストコンテキストを与える場所 (3)      Perl 関連のドキュメントで LIST と書いてあると      ころ。               perl のマニュアルページ、ラクダ本               man perlfun...
リストコンテキストを与える場所 (3)      Perl 関連のドキュメントで LIST と書いてあると      ころ。               perl のマニュアルページ、ラクダ本               man perlfun...
リストコンテキストを与える場所 (3)      Perl 関連のドキュメントで LIST と書いてあると      ころ。               perl のマニュアルページ、ラクダ本               man perlfun...
コンテキストによって異なる値を返すもの:配列変数名      配列変数名近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   12 / 57
コンテキストによって異なる値を返すもの:配列変数名      配列変数名      リストコンテキストでは、配列の要素から成るリ      スト値を返す近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!...
コンテキストによって異なる値を返すもの:配列変数名      配列変数名      リストコンテキストでは、配列の要素から成るリ      スト値を返す      スカラーコンテキストでは、配列の要素の個数を      返す近藤 嘉雪 (@yo...
コンテキストによって異なる値を返すもの:配列変数名      配列変数名      リストコンテキストでは、配列の要素から成るリ      スト値を返す      スカラーコンテキストでは、配列の要素の個数を      返す      # リス...
配列名とコンテキストの落とし穴      サブルーチン、組込関数の引数リストは、リスト      コンテキストで評価される      @array = qw(foo bar zot);      my $n = @array; # $n は 3...
配列名とコンテキストの落とし穴      サブルーチン、組込関数の引数リストは、リスト      コンテキストで評価される      @array = qw(foo bar zot);      my $n = @array; # $n は 3...
リストからスカラー変数への代入にご用心      リストと配列の違いに注意      a=one two three と表示される      @a = (’one’, ’two’, ’three’);      print "a=@an";近藤...
リストからスカラー変数への代入にご用心      リストと配列の違いに注意      a=one two three と表示される      @a = (’one’, ’two’, ’three’);      print "a=@an";  ...
リストからスカラー変数への代入にご用心      リストと配列の違いに注意      a=one two three と表示される      @a = (’one’, ’two’, ’three’);      print "a=@an";  ...
コンテキストによって異なる値を返すもの:入力演算子 <>      入力演算子 <>近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   1...
コンテキストによって異なる値を返すもの:入力演算子 <>      入力演算子 <>      スカラーコンテキストでは、次の1行を返す      $line = <INPUT>;近藤 嘉雪 (@yoshiyuki kondo)   コンテキス...
コンテキストによって異なる値を返すもの:入力演算子 <>      入力演算子 <>      スカラーコンテキストでは、次の1行を返す      $line = <INPUT>;      リストコンテキストでは、残りのすべての行を読    ...
コンテキストによって異なる値を返すもの:入力演算子 <>      入力演算子 <>      スカラーコンテキストでは、次の1行を返す      $line = <INPUT>;      リストコンテキストでは、残りのすべての行を読    ...
ここで注意!      リスト値を返す関数を、スカラーコンテキストで      評価すると、返すリストの個数を返す *わけでは      ない* ので注意。近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物...
ここで注意!      リスト値を返す関数を、スカラーコンテキストで      評価すると、返すリストの個数を返す *わけでは      ない* ので注意。      答えは、それぞれ関数によって、スカラーコンテ      キストで筋が通った ...
コンテキストによって動作が変わる関数 (1)      コンテキストによって、違う値を返す組み込み関      数は、マニュアルにそのように明記されている。      「perldoc -f 関数名」で組み込み関数のマニュアル      が表示...
getpwnam 関数       ユーザ名を受け取り、そのユーザに関する情報を       返す 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9...
getpwnam 関数       ユーザ名を受け取り、そのユーザに関する情報を       返す       リストコンテキストでは、/etc/passwd の情報をリ       スト値で返す       ($name,$passwd,$u...
getpwnam 関数       ユーザ名を受け取り、そのユーザに関する情報を       返す       リストコンテキストでは、/etc/passwd の情報をリ       スト値で返す       ($name,$passwd,$u...
localtime 関数       いわゆる Unix time 値を、年月日時分秒に変換し       て返す 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012...
localtime 関数       いわゆる Unix time 値を、年月日時分秒に変換し       て返す       リストコンテキストでは、9 要素のリスト値を       返す       # 0     1    2     3...
localtime 関数       いわゆる Unix time 値を、年月日時分秒に変換し       て返す       リストコンテキストでは、9 要素のリスト値を       返す       # 0     1    2     3...
localtime 関数       いわゆる Unix time 値を、年月日時分秒に変換し       て返す       リストコンテキストでは、9 要素のリスト値を       返す       # 0     1    2     3...
reverse 関数       リストコンテキストでは、渡されたリストを逆順       にしたリストを返す 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (...
reverse 関数       リストコンテキストでは、渡されたリストを逆順       にしたリストを返す       Q: スカラーコンテキストでは何を返す? 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレン...
reverse 関数       リストコンテキストでは、渡されたリストを逆順       にしたリストを返す       Q: スカラーコンテキストでは何を返す?       A: 引数を文字列として連結して、その文字列を逆       順に...
reverse 関数をスカラーコンテキストで評価すると      引数を文字列として連結して、その文字列を逆順      にした文字列を返す近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAP...
reverse 関数をスカラーコンテキストで評価すると      引数を文字列として連結して、その文字列を逆順      にした文字列を返す      my @array = qw(one two three);      my @list =...
reverse 関数をスカラーコンテキストで評価すると      引数を文字列として連結して、その文字列を逆順      にした文字列を返す      my @array = qw(one two three);      my @list =...
reverse 関数をスカラーコンテキストで評価すると      引数を文字列として連結して、その文字列を逆順      にした文字列を返す      my @array = qw(one two three);      my @list =...
番外: chomp 演算子       文字列の末尾に改行文字があればそれを削除する 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   ...
番外: chomp 演算子       文字列の末尾に改行文字があればそれを削除する       引数には、左辺値 (スカラー変数や配列要素) を       渡す 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレン...
番外: chomp 演算子       文字列の末尾に改行文字があればそれを削除する       引数には、左辺値 (スカラー変数や配列要素) を       渡す       リストを渡すと、すべての要素から、末尾の改行       文字を取...
番外: chomp 演算子       文字列の末尾に改行文字があればそれを削除する       引数には、左辺値 (スカラー変数や配列要素) を       渡す       リストを渡すと、すべての要素から、末尾の改行       文字を取...
番外: chomp 演算子       文字列の末尾に改行文字があればそれを削除する       引数には、左辺値 (スカラー変数や配列要素) を       渡す       リストを渡すと、すべての要素から、末尾の改行       文字を取...
コンテキストに応じてサブルーチンの動作を変える      サブルーチンの中で wantarray 関数を呼び出すと、      コンテキストを識別できる近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!...
コンテキストに応じてサブルーチンの動作を変える      サブルーチンの中で wantarray 関数を呼び出すと、      コンテキストを識別できる               リストコンテキストなら真               スカラー...
コンテキストに応じてサブルーチンの動作を変える      サブルーチンの中で wantarray 関数を呼び出すと、      コンテキストを識別できる               リストコンテキストなら真               スカラー...
コンテキストに応じてサブルーチンの動作を変える      サブルーチンの中で wantarray 関数を呼び出すと、      コンテキストを識別できる               リストコンテキストなら真               スカラー...
コンテキストに応じてサブルーチンの動作を変える      サブルーチンの中で wantarray 関数を呼び出すと、      コンテキストを識別できる               リストコンテキストなら真               スカラー...
//演算子とコンテキスト (1)       スカラーコンテキストでは、マッチしたか否かを       示す。 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (...
//演算子とコンテキスト (1)       スカラーコンテキストでは、マッチしたか否かを       示す。       $_ = "apple=10";       if (/ˆ(.+)=(d+)$/) {          print "...
//演算子とコンテキスト (1)       スカラーコンテキストでは、マッチしたか否かを       示す。       $_ = "apple=10";       if (/ˆ(.+)=(d+)$/) {          print "...
//演算子とコンテキスト (1)     スカラーコンテキストでは、マッチしたか否かを     示す。     $_ = "apple=10";     if (/ˆ(.+)=(d+)$/) {        print "key=[$1] v...
//演算子とコンテキスト (2)       マッチの結果を、スカラー変数のリストに代入       する 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (20...
//演算子とコンテキスト (2)       マッチの結果を、スカラー変数のリストに代入       する       $_ = "apple=10";       my ($key, $val) = /ˆ(.+)=(d+)$/;       ...
//演算子とコンテキスト (2)       マッチの結果を、スカラー変数のリストに代入       する       $_ = "apple=10";       my ($key, $val) = /ˆ(.+)=(d+)$/;       ...
//演算子とコンテキスト (2)       マッチの結果を、スカラー変数のリストに代入       する       $_ = "apple=10";       my ($key, $val) = /ˆ(.+)=(d+)$/;       ...
//演算子とコンテキスト (2)       マッチの結果を、スカラー変数のリストに代入       する       $_ = "apple=10";       my ($key, $val) = /ˆ(.+)=(d+)$/;       ...
//演算子とコンテキスト (2)       マッチの結果を、スカラー変数のリストに代入       する       $_ = "apple=10";       my ($key, $val) = /ˆ(.+)=(d+)$/;       ...
リファレンス近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   26 / 57
リファレンスとは?      リファレンス(reference)は、他のデータを指す      データ型である               スカラー型の一種近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物...
リファレンスとは?      リファレンス(reference)は、他のデータを指す      データ型である               スカラー型の一種      C 言語のポインタに相当するもの近藤 嘉雪 (@yoshiyuki kond...
リファレンスとは?      リファレンス(reference)は、他のデータを指す      データ型である               スカラー型の一種      C 言語のポインタに相当するもの      リファレンスを利用して、複雑なデ...
変数へのリファレンスを得る      変数の前に逆スラッシュをつけると、リファレン      スが得られる               C の単項&演算子に相当               $scaler_ref = $scalar;     ...
変数へのリファレンスを得る      変数の前に逆スラッシュをつけると、リファレン      スが得られる               C の単項&演算子に相当               $scaler_ref = $scalar;     ...
変数へのリファレンスを得る      変数の前に逆スラッシュをつけると、リファレン      スが得られる               C の単項&演算子に相当               $scaler_ref = $scalar;     ...
変数へのリファレンスを得る      変数の前に逆スラッシュをつけると、リファレン      スが得られる               C の単項&演算子に相当               $scaler_ref = $scalar;     ...
変数へのリファレンスを得る      変数の前に逆スラッシュをつけると、リファレン      スが得られる               C の単項&演算子に相当               $scaler_ref = $scalar;     ...
変数へのリファレンスを得る      変数の前に逆スラッシュをつけると、リファレン      スが得られる               C の単項&演算子に相当               $scaler_ref = $scalar;     ...
デリファレンス      リファレンスをたどって、指しているデータにア      クセスすることをデリファレンス(dereference)      という近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物...
デリファレンス      リファレンスをたどって、指しているデータにア      クセスすることをデリファレンス(dereference)      という      Perl では、変数の種別を表すプレフィクス文字$、      @、%、&な...
スカラーのデリファレンス      デリファレンスした結果はその型の変数として扱      える近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/2...
スカラーのデリファレンス      デリファレンスした結果はその型の変数として扱      える      スカラーへのリファレンスを取得      $sref = $x;近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリフ...
スカラーのデリファレンス      デリファレンスした結果はその型の変数として扱      える      スカラーへのリファレンスを取得      $sref = $x;      スカラー値にアクセスする      $a = $$ref;近...
スカラーのデリファレンス      デリファレンスした結果はその型の変数として扱      える      スカラーへのリファレンスを取得      $sref = $x;      スカラー値にアクセスする      $a = $$ref; ...
配列のデリファレンス近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   31 / 57
配列のデリファレンス      配列へのリファレンスを取得する      $array_ref = @array;近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 ...
配列のデリファレンス      配列へのリファレンスを取得する      $array_ref = @array;      配列全体にアクセス      @s = @$array_ref;近藤 嘉雪 (@yoshiyuki kondo)   ...
配列のデリファレンス      配列へのリファレンスを取得する      $array_ref = @array;      配列全体にアクセス      @s = @$array_ref;      配列の要素にアクセス      $$arr...
配列のデリファレンス      配列へのリファレンスを取得する      $array_ref = @array;      配列全体にアクセス      @s = @$array_ref;      配列の要素にアクセス      $$arr...
配列のデリファレンスの例      関数 compute_sum: 配列リファレンスを受け取っ      て、要素の和を返す      sub compute_sum {          my ($aref) = @_; # リファレンスを$...
ハッシュのデリファレンス近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   33 / 57
ハッシュのデリファレンス      ハッシュへのリファレンスを取得する      $href = %h;近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012...
ハッシュのデリファレンス      ハッシュへのリファレンスを取得する      $href = %h;      ハッシュの要素にアクセス      $x = $$href{’a’};近藤 嘉雪 (@yoshiyuki kondo)   コン...
ハッシュのデリファレンス      ハッシュへのリファレンスを取得する      $href = %h;      ハッシュの要素にアクセス      $x = $$href{’a’};      keys 関数で、ハッシュのすべてのキーを取り...
サブルーチンのデリファレンス      コードレフ (coderef) とも呼ばれる近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   3...
サブルーチンのデリファレンス      コードレフ (coderef) とも呼ばれる      サブルーチンへのリファレンスを取得する      $fref = &func;近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリ...
サブルーチンのデリファレンス      コードレフ (coderef) とも呼ばれる      サブルーチンへのリファレンスを取得する      $fref = &func;      サブルーチンを呼び出す      &$fref($para...
デリファレンスの失敗      リファレンスの本来の型以外にデリファレンスし      ようとするとエラーになる      $aref = @array;      $$aref = 10;               Not a SCALAR...
ref 関数       引数がリファレンスなら真、そうでなければ偽を       返す       真の値は、リファレンスが指すものの種類を示す       文字列                            リファレンス     ...
リファレンスから文字列への変換      リファレンスは必要に応じて文字列に変換される近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   ...
リファレンスから文字列への変換      リファレンスは必要に応じて文字列に変換される               例えば print 文の引数として使った場合近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我...
リファレンスから文字列への変換      リファレンスは必要に応じて文字列に変換される               例えば print 文の引数として使った場合      具体的には「型名+ 16 進表記のアドレス」となる           ...
リファレンスから文字列への変換      リファレンスは必要に応じて文字列に変換される               例えば print 文の引数として使った場合      具体的には「型名+ 16 進表記のアドレス」となる           ...
リファレンスから文字列への変換      リファレンスは必要に応じて文字列に変換される               例えば print 文の引数として使った場合      具体的には「型名+ 16 進表記のアドレス」となる           ...
ブロックを使ったデリファレンス      変数名やサブルーチン名のうち、英数字の識別子      の変わりにブロックを置ける近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia ...
ブロックを使ったデリファレンス      変数名やサブルーチン名のうち、英数字の識別子      の変わりにブロックを置ける      ブロックは正しいリファレンス値を返さなければ      ならない近藤 嘉雪 (@yoshiyuki kond...
ブロックを使ったデリファレンス      変数名やサブルーチン名のうち、英数字の識別子      の変わりにブロックを置ける      ブロックは正しいリファレンス値を返さなければ      ならない      スカラーのデリファレンス    ...
ブロックを使ったデリファレンス      変数名やサブルーチン名のうち、英数字の識別子      の変わりにブロックを置ける      ブロックは正しいリファレンス値を返さなければ      ならない      スカラーのデリファレンス    ...
ブロックを使ったデリファレンス      変数名やサブルーチン名のうち、英数字の識別子      の変わりにブロックを置ける      ブロックは正しいリファレンス値を返さなければ      ならない      スカラーのデリファレンス    ...
${$a[2]} と$$a[2] の違い 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   39 / 57
-> によるデリファレンス      $a->[3] は$$a[3] を表す近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   40 / 57
-> によるデリファレンス      $a->[3] は$$a[3] を表す      $h->{key}は$$h{key}を表す近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::As...
-> によるデリファレンス      $a->[3] は$$a[3] を表す      $h->{key}は$$h{key}を表す      $f->($param) は&$f($param) を表す近藤 嘉雪 (@yoshiyuki kond...
-> によるデリファレンス      $a->[3] は$$a[3] を表す      $h->{key}は$$h{key}を表す      $f->($param) は&$f($param) を表す      多次元配列を表現する      ...
-> によるデリファレンス      $a->[3] は$$a[3] を表す      $h->{key}は$$h{key}を表す      $f->($param) は&$f($param) を表す      多次元配列を表現する      ...
多次元配列のエミュレーション      $a[3][2][5] のように書けば、あたかも多次元配      列のように使える近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia ...
多次元配列のエミュレーション      $a[3][2][5] のように書けば、あたかも多次元配      列のように使える      これは実際は$a[3]->[2]->[5] である近藤 嘉雪 (@yoshiyuki kondo)   コン...
多次元配列のエミュレーション      $a[3][2][5] のように書けば、あたかも多次元配      列のように使える      これは実際は$a[3]->[2]->[5] である      $a->[3][2][5] との違いに注意近藤...
$a[2][1] と$a->[2][1] の違い 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   42 / 57
無名配列、無名ハッシュの自動生成      Perl では、配列の大きさを宣言する必要はない               要素に値を代入すると、自動的に配列の領域が確保さ               れる近藤 嘉雪 (@yoshiyuki ko...
無名配列、無名ハッシュの自動生成      Perl では、配列の大きさを宣言する必要はない               要素に値を代入すると、自動的に配列の領域が確保さ               れる      $a[2][3] のような多...
無名配列、無名ハッシュの自動生成      Perl では、配列の大きさを宣言する必要はない               要素に値を代入すると、自動的に配列の領域が確保さ               れる      $a[2][3] のような多...
無名配列、無名ハッシュ近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   44 / 57
配列リファレンスを取得するには      配列リファレンスを受け取る関数 compute_sum      を呼び出す      my @tmp_array = (1, 3, 5, 7, 9);      print "Total: ", co...
配列リファレンスを取得するには      配列リファレンスを受け取る関数 compute_sum      を呼び出す      my @tmp_array = (1, 3, 5, 7, 9);      print "Total: ", co...
無名配列      Perl は、無名配列 (anonymous array) がサポート      している               ブラケット [] で要素を囲んで指定する               無名の配列が生成されて、それへのリ...
無名配列      Perl は、無名配列 (anonymous array) がサポート      している               ブラケット [] で要素を囲んで指定する               無名の配列が生成されて、それへのリ...
無名配列      Perl は、無名配列 (anonymous array) がサポート      している               ブラケット [] で要素を囲んで指定する               無名の配列が生成されて、それへのリ...
無名配列      関数 compute_sum を呼び出す      print "Total: ", compute_sum([1, 3, 5, 7, 9]), "n";近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリ...
無名配列      関数 compute_sum を呼び出す      print "Total: ", compute_sum([1, 3, 5, 7, 9]), "n";      リスト (1, 2, 3) と無名配列 [1, 2, 3]...
無名ハッシュ      ハッシュに関しては、無名ハッシュ(anonymous      hash)がある               ブレース{}で要素を囲んで指定する               要素は「キー、値」のペアで指定する      ...
無名ハッシュ      ハッシュに関しては、無名ハッシュ(anonymous      hash)がある               ブレース{}で要素を囲んで指定する               要素は「キー、値」のペアで指定する      ...
ハッシュと=>      =>は太い矢印 (thick arrow) と呼ばれる (「初めての      Perl」p@@@@)近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asi...
ハッシュと=>      =>は太い矢印 (thick arrow) と呼ばれる (「初めての      Perl」p@@@@)               基本的には、カンマと同じ意味近藤 嘉雪 (@yoshiyuki kondo)   コン...
ハッシュと=>      =>は太い矢印 (thick arrow) と呼ばれる (「初めての      Perl」p@@@@)               基本的には、カンマと同じ意味               =>の左側に英数字と下線のみ...
ハッシュと=>      =>は太い矢印 (thick arrow) と呼ばれる (「初めての      Perl」p@@@@)               基本的には、カンマと同じ意味               =>の左側に英数字と下線のみ...
ハッシュと=>      =>は太い矢印 (thick arrow) と呼ばれる (「初めての      Perl」p@@@@)               基本的には、カンマと同じ意味               =>の左側に英数字と下線のみ...
ハッシュと=>      =>は太い矢印 (thick arrow) と呼ばれる (「初めての      Perl」p@@@@)               基本的には、カンマと同じ意味               =>の左側に英数字と下線のみ...
無名配列と無名ハッシュを組み合わせる      自由に組み合わせることができる。      (C風の) 構造体やオブジェクトを表現するのに無      名ハッシュを使うのが定石      my $userinfo = {         nam...
Data::Dumper モジュール       リファレンスで複雑なデータ構造を作れるのはい       いけど、表示するにはどうするの? 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YA...
Data::Dumper モジュール       リファレンスで複雑なデータ構造を作れるのはい       いけど、表示するにはどうするの?       単にプリントすると HASH(0x116360) 近藤 嘉雪 (@yoshiyuki ko...
Data::Dumper モジュール       リファレンスで複雑なデータ構造を作れるのはい       いけど、表示するにはどうするの?       単にプリントすると HASH(0x116360)       そこで Data::Dump...
無名サブルーチン (コードレフ)、ク      ロージャ近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   52 / 57
無名サブルーチン      Perl は、無名サブルーチン(anonymous      subroutine)をサポートしている近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::As...
無名サブルーチン      Perl は、無名サブルーチン(anonymous      subroutine)をサポートしている               sub { ..... }と書く近藤 嘉雪 (@yoshiyuki kondo)  ...
無名サブルーチン      Perl は、無名サブルーチン(anonymous      subroutine)をサポートしている               sub { ..... }と書く               無名のサブルーチンが生...
無名サブルーチン      Perl は、無名サブルーチン(anonymous      subroutine)をサポートしている               sub { ..... }と書く               無名のサブルーチンが生...
無名サブルーチン      Perl は、無名サブルーチン(anonymous      subroutine)をサポートしている               sub { ..... }と書く               無名のサブルーチンが生...
無名サブルーチン      Perl は、無名サブルーチン(anonymous      subroutine)をサポートしている               sub { ..... }と書く               無名のサブルーチンが生...
クロージャ      クロージャ(closure) とは?               無名サブルーチンを生成する際に、その時点で見える               レキシカル変数 (my 変数) の実体も閉じ込められ             ...
関数 adder: 指定した数を加算して返す関数を返すsub adder {    my ($increment) = @_;           # この変数が閉じ込められる        return sub {            my...
関数 make counter: カウンタ関数を返すsub make_counter {    my ($counter) = @_;                   # この変数が閉じ込められる        return sub {  ...
ご静聴ありがとうございました近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   57 / 57
Upcoming SlideShare
Loading in …5
×

Perlの勘所をマスターしよう! コンテキストとリファレンスを我が物に!

9,151 views

Published on

YAPC::Asia 2012で行なったトークのスライドです(2012/9/29)

Perlの勘所をマスターしよう! コンテキストとリファレンスを我が物に!

  1. 1. . Perl の勘所をマスターしよう!. コンテキストとリファレンスを我が物に! 近藤 嘉雪 @yoshiyuki kondo YAPC::Asia 2012 (2012/9/29) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 1 / 57
  2. 2. 自己紹介 近藤 嘉雪 (こんどう よしゆき)近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  3. 3. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  4. 4. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo ホームページ http://www.kondoyoshiyuki.com/近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  5. 5. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo ホームページ http://www.kondoyoshiyuki.com/ 訳書 「プログラミング Perl」 「初めての Perl」近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  6. 6. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo ホームページ http://www.kondoyoshiyuki.com/ 訳書 「プログラミング Perl」 「初めての Perl」 著書 「定本 C プログラマのためのアルゴリズムとデータ 構造」 「定本 Java プログラマのためのアルゴリズムとデー タ構造」近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  7. 7. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo ホームページ http://www.kondoyoshiyuki.com/ 訳書 「プログラミング Perl」 「初めての Perl」 著書 「定本 C プログラマのためのアルゴリズムとデータ 構造」 「定本 Java プログラマのためのアルゴリズムとデー タ構造」 ヤフー株式会社で働いています近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  8. 8. 好きなもの:近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  9. 9. 好きなもの: エディタ:近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  10. 10. 好きなもの: エディタ: Emacs近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  11. 11. 好きなもの: エディタ: Emacs 日本語入力方式:近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  12. 12. 好きなもの: エディタ: Emacs 日本語入力方式: T-Code (2 ストローク直接入力)近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  13. 13. 本日お話する内容近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 4 / 57
  14. 14. 本日お話する内容 コンテキスト近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 4 / 57
  15. 15. 本日お話する内容 コンテキスト リファレンス近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 4 / 57
  16. 16. 本日お話する内容 コンテキスト リファレンス 以上近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 4 / 57
  17. 17. コンテキストの話近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 5 / 57
  18. 18. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  19. 19. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ スカラーコンテキストはスカラー値を期待近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  20. 20. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ スカラーコンテキストはスカラー値を期待 リストコンテキストはリスト値を期待近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  21. 21. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ スカラーコンテキストはスカラー値を期待 リストコンテキストはリスト値を期待 「スカラー変数への代入は、スカラーコンテキス トを与える」などと言う近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  22. 22. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ スカラーコンテキストはスカラー値を期待 リストコンテキストはリスト値を期待 「スカラー変数への代入は、スカラーコンテキス トを与える」などと言う 操作、演算子、関数の中には、コンテキストに応 じて違う値を返すものがある近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  23. 23. ほかのコンテキスト (1) 無効コンテキスト (void context)近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 7 / 57
  24. 24. ほかのコンテキスト (1) 無効コンテキスト (void context) 値を必要としない場所近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 7 / 57
  25. 25. ほかのコンテキスト (1) 無効コンテキスト (void context) 値を必要としない場所 use warnings; my $a = 100; $a + 20; Useless use of addition (+) in void context at - line 3.近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 7 / 57
  26. 26. ほかのコンテキスト (2) スカラーコンテキストはさらに分類される近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 8 / 57
  27. 27. ほかのコンテキスト (2) スカラーコンテキストはさらに分類される 文字列コンテキスト (string context) . 演算子、x の左側、ne、lt など近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 8 / 57
  28. 28. ほかのコンテキスト (2) スカラーコンテキストはさらに分類される 文字列コンテキスト (string context) . 演算子、x の左側、ne、lt など 数値コンテキスト (numeric context) +, -, *, /など近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 8 / 57
  29. 29. ほかのコンテキスト (2) スカラーコンテキストはさらに分類される 文字列コンテキスト (string context) . 演算子、x の左側、ne、lt など 数値コンテキスト (numeric context) +, -, *, /など 不定コンテキスト (don’t care context) どっちでもいいよ近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 8 / 57
  30. 30. ほかのコンテキスト (2) スカラーコンテキストはさらに分類される 文字列コンテキスト (string context) . 演算子、x の左側、ne、lt など 数値コンテキスト (numeric context) +, -, *, /など 不定コンテキスト (don’t care context) どっちでもいいよ ブール値コンテキスト (boolean context) 不定コンテキストの一種 条件式近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 8 / 57
  31. 31. リストコンテキストを与える場所 (1)近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 9 / 57
  32. 32. リストコンテキストを与える場所 (1) 配列変数、ハッシュ変数、リスト、スライスへの 代入の右辺 $x = func(); # スカラーコンテキスト @a = func(); # リストコンテキスト %h = func(); # リストコンテキスト ($x, $y) = func(); # リストコンテキスト ($x) = func(); # 要素が 1 個でもリストコンテキストになる!!! @a[0,1,2] = func(); # リストコンテキスト近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 9 / 57
  33. 33. リストコンテキストを与える場所 (1) 配列変数、ハッシュ変数、リスト、スライスへの 代入の右辺 $x = func(); # スカラーコンテキスト @a = func(); # リストコンテキスト %h = func(); # リストコンテキスト ($x, $y) = func(); # リストコンテキスト ($x) = func(); # 要素が 1 個でもリストコンテキストになる!!! @a[0,1,2] = func(); # リストコンテキスト 組み込み関数(複数のパラメータを受け取るも の、例えば print)への引数 詳しくは次の次のページで近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 9 / 57
  34. 34. リストコンテキストを与える場所 (1) 配列変数、ハッシュ変数、リスト、スライスへの 代入の右辺 $x = func(); # スカラーコンテキスト @a = func(); # リストコンテキスト %h = func(); # リストコンテキスト ($x, $y) = func(); # リストコンテキスト ($x) = func(); # 要素が 1 個でもリストコンテキストになる!!! @a[0,1,2] = func(); # リストコンテキスト 組み込み関数(複数のパラメータを受け取るも の、例えば print)への引数 詳しくは次の次のページで ユーザ定義のサブルーチンへの引数近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 9 / 57
  35. 35. リストコンテキストを与える場所 (1) 配列変数、ハッシュ変数、リスト、スライスへの 代入の右辺 $x = func(); # スカラーコンテキスト @a = func(); # リストコンテキスト %h = func(); # リストコンテキスト ($x, $y) = func(); # リストコンテキスト ($x) = func(); # 要素が 1 個でもリストコンテキストになる!!! @a[0,1,2] = func(); # リストコンテキスト 組み込み関数(複数のパラメータを受け取るも の、例えば print)への引数 詳しくは次の次のページで ユーザ定義のサブルーチンへの引数 foreach の () の内側近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 9 / 57
  36. 36. リストコンテキストを与える場所 (1) 配列変数、ハッシュ変数、リスト、スライスへの 代入の右辺 $x = func(); # スカラーコンテキスト @a = func(); # リストコンテキスト %h = func(); # リストコンテキスト ($x, $y) = func(); # リストコンテキスト ($x) = func(); # 要素が 1 個でもリストコンテキストになる!!! @a[0,1,2] = func(); # リストコンテキスト 組み込み関数(複数のパラメータを受け取るも の、例えば print)への引数 詳しくは次の次のページで ユーザ定義のサブルーチンへの引数 foreach の () の内側 スライスの添え字 @array[LIST], @hash{LIST}近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 9 / 57
  37. 37. リストコンテキストを与える場所 (2)近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 10 / 57
  38. 38. リストコンテキストを与える場所 (2) リストコンテキスト以外の場所はスカラーコンテ キストとなる近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 10 / 57
  39. 39. リストコンテキストを与える場所 (2) リストコンテキスト以外の場所はスカラーコンテ キストとなる scalar 関数によって、強制的にスカラーコンテキ ストを適用できる近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 10 / 57
  40. 40. リストコンテキストを与える場所 (2) リストコンテキスト以外の場所はスカラーコンテ キストとなる scalar 関数によって、強制的にスカラーコンテキ ストを適用できる my や our 宣言は、コンテキストに影響を与えない my $x = func(); # スカラーコンテキスト my ($x, $y) = func(); # リストコンテキスト my (@a) = func(); # リストコンテキスト近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 10 / 57
  41. 41. リストコンテキストを与える場所 (3) Perl 関連のドキュメントで LIST と書いてあると ころ。 perl のマニュアルページ、ラクダ本 man perlfunc, man perlop近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 11 / 57
  42. 42. リストコンテキストを与える場所 (3) Perl 関連のドキュメントで LIST と書いてあると ころ。 perl のマニュアルページ、ラクダ本 man perlfunc, man perlop 特定の関数のマニュアルを表示する perldoc -f printf printf FILEHANDLE FORMAT, LIST printf FILEHANDLE printf FORMAT, LIST printf Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 11 / 57
  43. 43. リストコンテキストを与える場所 (3) Perl 関連のドキュメントで LIST と書いてあると ころ。 perl のマニュアルページ、ラクダ本 man perlfunc, man perlop 特定の関数のマニュアルを表示する perldoc -f printf printf FILEHANDLE FORMAT, LIST printf FILEHANDLE printf FORMAT, LIST printf Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST perldoc.jp に日本語訳があります近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 11 / 57
  44. 44. コンテキストによって異なる値を返すもの:配列変数名 配列変数名近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 12 / 57
  45. 45. コンテキストによって異なる値を返すもの:配列変数名 配列変数名 リストコンテキストでは、配列の要素から成るリ スト値を返す近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 12 / 57
  46. 46. コンテキストによって異なる値を返すもの:配列変数名 配列変数名 リストコンテキストでは、配列の要素から成るリ スト値を返す スカラーコンテキストでは、配列の要素の個数を 返す近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 12 / 57
  47. 47. コンテキストによって異なる値を返すもの:配列変数名 配列変数名 リストコンテキストでは、配列の要素から成るリ スト値を返す スカラーコンテキストでは、配列の要素の個数を 返す # リストコンテキスト  @b の内容が@a にコピーされる @a = @b; # スカラーコンテキスト @b の要素の個数が$n に入る $n = @b;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 12 / 57
  48. 48. 配列名とコンテキストの落とし穴 サブルーチン、組込関数の引数リストは、リスト コンテキストで評価される @array = qw(foo bar zot); my $n = @array; # $n は 3 になる print "Array has ", @array, "elementsn"; # ダメ近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 13 / 57
  49. 49. 配列名とコンテキストの落とし穴 サブルーチン、組込関数の引数リストは、リスト コンテキストで評価される @array = qw(foo bar zot); my $n = @array; # $n は 3 になる print "Array has ", @array, "elementsn"; # ダメ scalar 疑似関数を使えば、リストコンテキストの 中で、引数をスカラーコンテキストで評価できる。 print "Array has ", @array, "elementsn"; # ダメ print "Array has ", scalar @array, "elementsn"; #近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 13 / 57
  50. 50. リストからスカラー変数への代入にご用心 リストと配列の違いに注意 a=one two three と表示される @a = (’one’, ’two’, ’three’); print "a=@an";近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 14 / 57
  51. 51. リストからスカラー変数への代入にご用心 リストと配列の違いに注意 a=one two three と表示される @a = (’one’, ’two’, ’three’); print "a=@an"; x=three と表示される!! one ではない!! これはカンマ演算子と解釈されるため $x = (’one’, ’two’, ’three’); print "x=$xn"; #近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 14 / 57
  52. 52. リストからスカラー変数への代入にご用心 リストと配列の違いに注意 a=one two three と表示される @a = (’one’, ’two’, ’three’); print "a=@an"; x=three と表示される!! one ではない!! これはカンマ演算子と解釈されるため $x = (’one’, ’two’, ’three’); print "x=$xn"; # 要素の個数 3 が得られる $y = @a; print "y=$yn"; # y=3近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 14 / 57
  53. 53. コンテキストによって異なる値を返すもの:入力演算子 <> 入力演算子 <>近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 15 / 57
  54. 54. コンテキストによって異なる値を返すもの:入力演算子 <> 入力演算子 <> スカラーコンテキストでは、次の1行を返す $line = <INPUT>;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 15 / 57
  55. 55. コンテキストによって異なる値を返すもの:入力演算子 <> 入力演算子 <> スカラーコンテキストでは、次の1行を返す $line = <INPUT>; リストコンテキストでは、残りのすべての行を読 んでリストにして返す @date = <INPUT>;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 15 / 57
  56. 56. コンテキストによって異なる値を返すもの:入力演算子 <> 入力演算子 <> スカラーコンテキストでは、次の1行を返す $line = <INPUT>; リストコンテキストでは、残りのすべての行を読 んでリストにして返す @date = <INPUT>; 次の1行を読み込んで表示するには print <INPUT>; # ダメ print scalar(<INPUT>); # OK近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 15 / 57
  57. 57. ここで注意! リスト値を返す関数を、スカラーコンテキストで 評価すると、返すリストの個数を返す *わけでは ない* ので注意。近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 16 / 57
  58. 58. ここで注意! リスト値を返す関数を、スカラーコンテキストで 評価すると、返すリストの個数を返す *わけでは ない* ので注意。 答えは、それぞれ関数によって、スカラーコンテ キストで筋が通った (と考える) 値を返す。 これについては、この後すぐに…近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 16 / 57
  59. 59. コンテキストによって動作が変わる関数 (1) コンテキストによって、違う値を返す組み込み関 数は、マニュアルにそのように明記されている。 「perldoc -f 関数名」で組み込み関数のマニュアル が表示されます。近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 17 / 57
  60. 60. getpwnam 関数 ユーザ名を受け取り、そのユーザに関する情報を 返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 18 / 57
  61. 61. getpwnam 関数 ユーザ名を受け取り、そのユーザに関する情報を 返す リストコンテキストでは、/etc/passwd の情報をリ スト値で返す ($name,$passwd,$uid,$gid,$quota,$comment, $gcos,$dir,$shell,$expire) = getpwnam 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 18 / 57
  62. 62. getpwnam 関数 ユーザ名を受け取り、そのユーザに関する情報を 返す リストコンテキストでは、/etc/passwd の情報をリ スト値で返す ($name,$passwd,$uid,$gid,$quota,$comment, $gcos,$dir,$shell,$expire) = getpwnam スカラーコンテキストでは、UID を返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 18 / 57
  63. 63. localtime 関数 いわゆる Unix time 値を、年月日時分秒に変換し て返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 19 / 57
  64. 64. localtime 関数 いわゆる Unix time 値を、年月日時分秒に変換し て返す リストコンテキストでは、9 要素のリスト値を 返す # 0 1 2 3 4 5 6 7 8 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 19 / 57
  65. 65. localtime 関数 いわゆる Unix time 値を、年月日時分秒に変換し て返す リストコンテキストでは、9 要素のリスト値を 返す # 0 1 2 3 4 5 6 7 8 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) スカラーコンテキストでは、日時を表わす文字列 を返す $ perl -le ’print scalar(localtime)’ Sat Sep 29 05:49:52 2012 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 19 / 57
  66. 66. localtime 関数 いわゆる Unix time 値を、年月日時分秒に変換し て返す リストコンテキストでは、9 要素のリスト値を 返す # 0 1 2 3 4 5 6 7 8 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) スカラーコンテキストでは、日時を表わす文字列 を返す $ perl -le ’print scalar(localtime)’ Sat Sep 29 05:49:52 2012 scalar を入れないと $ perl -le ’print localtime’ 4650529811262720 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 19 / 57
  67. 67. reverse 関数 リストコンテキストでは、渡されたリストを逆順 にしたリストを返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 20 / 57
  68. 68. reverse 関数 リストコンテキストでは、渡されたリストを逆順 にしたリストを返す Q: スカラーコンテキストでは何を返す? 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 20 / 57
  69. 69. reverse 関数 リストコンテキストでは、渡されたリストを逆順 にしたリストを返す Q: スカラーコンテキストでは何を返す? A: 引数を文字列として連結して、その文字列を逆 順にした文字列を返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 20 / 57
  70. 70. reverse 関数をスカラーコンテキストで評価すると 引数を文字列として連結して、その文字列を逆順 にした文字列を返す近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 21 / 57
  71. 71. reverse 関数をスカラーコンテキストで評価すると 引数を文字列として連結して、その文字列を逆順 にした文字列を返す my @array = qw(one two three); my @list = reverse(@array); print "@listn"; # three two one近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 21 / 57
  72. 72. reverse 関数をスカラーコンテキストで評価すると 引数を文字列として連結して、その文字列を逆順 にした文字列を返す my @array = qw(one two three); my @list = reverse(@array); print "@listn"; # three two one print scalar(reverse(@array)), "n"; # eerhtowteno近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 21 / 57
  73. 73. reverse 関数をスカラーコンテキストで評価すると 引数を文字列として連結して、その文字列を逆順 にした文字列を返す my @array = qw(one two three); my @list = reverse(@array); print "@listn"; # three two one print scalar(reverse(@array)), "n"; # eerhtowteno my $reversed = reverse("hello"); print $reversed, "n"; # olleh近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 21 / 57
  74. 74. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  75. 75. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 引数には、左辺値 (スカラー変数や配列要素) を 渡す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  76. 76. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 引数には、左辺値 (スカラー変数や配列要素) を 渡す リストを渡すと、すべての要素から、末尾の改行 文字を取り除く 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  77. 77. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 引数には、左辺値 (スカラー変数や配列要素) を 渡す リストを渡すと、すべての要素から、末尾の改行 文字を取り除く 配列を渡すと、一括して chomp できる my @lines = <>; chomp(@lines); 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  78. 78. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 引数には、左辺値 (スカラー変数や配列要素) を 渡す リストを渡すと、すべての要素から、末尾の改行 文字を取り除く 配列を渡すと、一括して chomp できる my @lines = <>; chomp(@lines); イディオムとして次のように書く chomp(my @lines = <>); 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  79. 79. コンテキストに応じてサブルーチンの動作を変える サブルーチンの中で wantarray 関数を呼び出すと、 コンテキストを識別できる近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 23 / 57
  80. 80. コンテキストに応じてサブルーチンの動作を変える サブルーチンの中で wantarray 関数を呼び出すと、 コンテキストを識別できる リストコンテキストなら真 スカラーコンテキストなら偽近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 23 / 57
  81. 81. コンテキストに応じてサブルーチンの動作を変える サブルーチンの中で wantarray 関数を呼び出すと、 コンテキストを識別できる リストコンテキストなら真 スカラーコンテキストなら偽 wantarray の返り値によって、戻り値を変える sub mysub { my @ans; # 処理の結果がここに入る # コンテキストに応じて返す値を変える return wantarray ? @ans : "@ans"; }近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 23 / 57
  82. 82. コンテキストに応じてサブルーチンの動作を変える サブルーチンの中で wantarray 関数を呼び出すと、 コンテキストを識別できる リストコンテキストなら真 スカラーコンテキストなら偽 wantarray の返り値によって、戻り値を変える sub mysub { my @ans; # 処理の結果がここに入る # コンテキストに応じて返す値を変える return wantarray ? @ans : "@ans"; } This function should have been named wantlist() instead.近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 23 / 57
  83. 83. コンテキストに応じてサブルーチンの動作を変える サブルーチンの中で wantarray 関数を呼び出すと、 コンテキストを識別できる リストコンテキストなら真 スカラーコンテキストなら偽 wantarray の返り値によって、戻り値を変える sub mysub { my @ans; # 処理の結果がここに入る # コンテキストに応じて返す値を変える return wantarray ? @ans : "@ans"; } This function should have been named wantlist() instead. 「本当は wantlist() という名前にすべきだったんだ けどね、てへぺろ」近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 23 / 57
  84. 84. //演算子とコンテキスト (1) スカラーコンテキストでは、マッチしたか否かを 示す。 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 24 / 57
  85. 85. //演算子とコンテキスト (1) スカラーコンテキストでは、マッチしたか否かを 示す。 $_ = "apple=10"; if (/ˆ(.+)=(d+)$/) { print "key=[$1] value=[$2]n"; # key=[apple] value=[10] } else { # マッチしなかった } 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 24 / 57
  86. 86. //演算子とコンテキスト (1) スカラーコンテキストでは、マッチしたか否かを 示す。 $_ = "apple=10"; if (/ˆ(.+)=(d+)$/) { print "key=[$1] value=[$2]n"; # key=[apple] value=[10] } else { # マッチしなかった } リストコンテスキストでは、カッコでキャプチャ した文字列のリストを返す。 マッチしたが、カッコにマッチしない場合には、(1) を 返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 24 / 57
  87. 87. //演算子とコンテキスト (1) スカラーコンテキストでは、マッチしたか否かを 示す。 $_ = "apple=10"; if (/ˆ(.+)=(d+)$/) { print "key=[$1] value=[$2]n"; # key=[apple] value=[10] } else { # マッチしなかった } リストコンテスキストでは、カッコでキャプチャ した文字列のリストを返す。 マッチしたが、カッコにマッチしない場合には、(1) を 返す $_ = "apple=10"; my @a = /ˆ(.+)=(d+)$/; if (@a) { print "@an"; # apple 10 } else { # マッチしなかった 近藤 嘉雪 } (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 24 / 57
  88. 88. //演算子とコンテキスト (2) マッチの結果を、スカラー変数のリストに代入 する 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 25 / 57
  89. 89. //演算子とコンテキスト (2) マッチの結果を、スカラー変数のリストに代入 する $_ = "apple=10"; my ($key, $val) = /ˆ(.+)=(d+)$/; print "key=[$key] value=[$val]n"; # key=[apple] value=[10] 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 25 / 57
  90. 90. //演算子とコンテキスト (2) マッチの結果を、スカラー変数のリストに代入 する $_ = "apple=10"; my ($key, $val) = /ˆ(.+)=(d+)$/; print "key=[$key] value=[$val]n"; # key=[apple] value=[10] さらに、それを if 文の条件式にする 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 25 / 57
  91. 91. //演算子とコンテキスト (2) マッチの結果を、スカラー変数のリストに代入 する $_ = "apple=10"; my ($key, $val) = /ˆ(.+)=(d+)$/; print "key=[$key] value=[$val]n"; # key=[apple] value=[10] さらに、それを if 文の条件式にする $_ = "apple=10"; if (my ($key, $val) = /ˆ(.+)=(d+)$/) { print "key=[$key] value=[$val]n"; } else { # マッチしなかった } 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 25 / 57
  92. 92. //演算子とコンテキスト (2) マッチの結果を、スカラー変数のリストに代入 する $_ = "apple=10"; my ($key, $val) = /ˆ(.+)=(d+)$/; print "key=[$key] value=[$val]n"; # key=[apple] value=[10] さらに、それを if 文の条件式にする $_ = "apple=10"; if (my ($key, $val) = /ˆ(.+)=(d+)$/) { print "key=[$key] value=[$val]n"; } else { # マッチしなかった } リスト代入をスカラーコンテキストで評価する と、代入された要素の個数が得られる 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 25 / 57
  93. 93. //演算子とコンテキスト (2) マッチの結果を、スカラー変数のリストに代入 する $_ = "apple=10"; my ($key, $val) = /ˆ(.+)=(d+)$/; print "key=[$key] value=[$val]n"; # key=[apple] value=[10] さらに、それを if 文の条件式にする $_ = "apple=10"; if (my ($key, $val) = /ˆ(.+)=(d+)$/) { print "key=[$key] value=[$val]n"; } else { # マッチしなかった } リスト代入をスカラーコンテキストで評価する と、代入された要素の個数が得られる if 文以外の条件式としても同じことができる 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 25 / 57
  94. 94. リファレンス近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 26 / 57
  95. 95. リファレンスとは? リファレンス(reference)は、他のデータを指す データ型である スカラー型の一種近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 27 / 57
  96. 96. リファレンスとは? リファレンス(reference)は、他のデータを指す データ型である スカラー型の一種 C 言語のポインタに相当するもの近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 27 / 57
  97. 97. リファレンスとは? リファレンス(reference)は、他のデータを指す データ型である スカラー型の一種 C 言語のポインタに相当するもの リファレンスを利用して、複雑なデータ構造を表 現できる 連結リスト、木構造、グラフ etc.近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 27 / 57
  98. 98. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる C の単項&演算子に相当 $scaler_ref = $scalar; # スカラー近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 28 / 57
  99. 99. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる C の単項&演算子に相当 $scaler_ref = $scalar; # スカラー $array_ref = @array; # 配列近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 28 / 57
  100. 100. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる C の単項&演算子に相当 $scaler_ref = $scalar; # スカラー $array_ref = @array; # 配列 $hash_ref = %hash; # ハッシュ近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 28 / 57
  101. 101. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる C の単項&演算子に相当 $scaler_ref = $scalar; # スカラー $array_ref = @array; # 配列 $hash_ref = %hash; # ハッシュ $func_ref = &function; # サブルーチン近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 28 / 57
  102. 102. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる C の単項&演算子に相当 $scaler_ref = $scalar; # スカラー $array_ref = @array; # 配列 $hash_ref = %hash; # ハッシュ $func_ref = &function; # サブルーチン $glob_ref = *STDOUT; # グロブ近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 28 / 57
  103. 103. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる C の単項&演算子に相当 $scaler_ref = $scalar; # スカラー $array_ref = @array; # 配列 $hash_ref = %hash; # ハッシュ $func_ref = &function; # サブルーチン $glob_ref = *STDOUT; # グロブ リファレンス値はスカラーとして扱える近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 28 / 57
  104. 104. デリファレンス リファレンスをたどって、指しているデータにア クセスすることをデリファレンス(dereference) という近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 29 / 57
  105. 105. デリファレンス リファレンスをたどって、指しているデータにア クセスすることをデリファレンス(dereference) という Perl では、変数の種別を表すプレフィクス文字$、 @、%、&などを使う これらの文字をシジル (sigil) という C では単項の*によってデリファレンスを行う近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 29 / 57
  106. 106. スカラーのデリファレンス デリファレンスした結果はその型の変数として扱 える近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 30 / 57
  107. 107. スカラーのデリファレンス デリファレンスした結果はその型の変数として扱 える スカラーへのリファレンスを取得 $sref = $x;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 30 / 57
  108. 108. スカラーのデリファレンス デリファレンスした結果はその型の変数として扱 える スカラーへのリファレンスを取得 $sref = $x; スカラー値にアクセスする $a = $$ref;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 30 / 57
  109. 109. スカラーのデリファレンス デリファレンスした結果はその型の変数として扱 える スカラーへのリファレンスを取得 $sref = $x; スカラー値にアクセスする $a = $$ref; コード例 my $x = 100; my $sref = $x; # スカラーリファレンスを$sref に代入 print "$$sref $xn"; # 100 100 と表示 $$sref += 5; print "$$sref $xn"; # 105 105 と表示近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 30 / 57
  110. 110. 配列のデリファレンス近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 31 / 57
  111. 111. 配列のデリファレンス 配列へのリファレンスを取得する $array_ref = @array;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 31 / 57
  112. 112. 配列のデリファレンス 配列へのリファレンスを取得する $array_ref = @array; 配列全体にアクセス @s = @$array_ref;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 31 / 57
  113. 113. 配列のデリファレンス 配列へのリファレンスを取得する $array_ref = @array; 配列全体にアクセス @s = @$array_ref; 配列の要素にアクセス $$array_ref[10] = 10;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 31 / 57
  114. 114. 配列のデリファレンス 配列へのリファレンスを取得する $array_ref = @array; 配列全体にアクセス @s = @$array_ref; 配列の要素にアクセス $$array_ref[10] = 10; foreach 文で配列の要素を順に処理する foreach (@$array_ref) {近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 31 / 57
  115. 115. 配列のデリファレンスの例 関数 compute_sum: 配列リファレンスを受け取っ て、要素の和を返す sub compute_sum { my ($aref) = @_; # リファレンスを$aref へ代入 my $sum = 0; foreach (@$aref) { # 配列をデリファレンス $sum += $_; } return $sum; }近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 32 / 57
  116. 116. ハッシュのデリファレンス近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 33 / 57
  117. 117. ハッシュのデリファレンス ハッシュへのリファレンスを取得する $href = %h;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 33 / 57
  118. 118. ハッシュのデリファレンス ハッシュへのリファレンスを取得する $href = %h; ハッシュの要素にアクセス $x = $$href{’a’};近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 33 / 57
  119. 119. ハッシュのデリファレンス ハッシュへのリファレンスを取得する $href = %h; ハッシュの要素にアクセス $x = $$href{’a’}; keys 関数で、ハッシュのすべてのキーを取り出す foreach (keys %$href) {近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 33 / 57
  120. 120. サブルーチンのデリファレンス コードレフ (coderef) とも呼ばれる近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 34 / 57
  121. 121. サブルーチンのデリファレンス コードレフ (coderef) とも呼ばれる サブルーチンへのリファレンスを取得する $fref = &func;近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 34 / 57
  122. 122. サブルーチンのデリファレンス コードレフ (coderef) とも呼ばれる サブルーチンへのリファレンスを取得する $fref = &func; サブルーチンを呼び出す &$fref($param);近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 34 / 57
  123. 123. デリファレンスの失敗 リファレンスの本来の型以外にデリファレンスし ようとするとエラーになる $aref = @array; $$aref = 10; Not a SCALAR reference at - line 7.近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 35 / 57
  124. 124. ref 関数 引数がリファレンスなら真、そうでなければ偽を 返す 真の値は、リファレンスが指すものの種類を示す 文字列 リファレンス REF スカラー SCALAR 配列 ARRAY ハッシュ HASH サブルーチン CODE 型グロブ GLOB オブジェクト 所属するクラス名 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 36 / 57
  125. 125. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  126. 126. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される 例えば print 文の引数として使った場合近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  127. 127. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される 例えば print 文の引数として使った場合 具体的には「型名+ 16 進表記のアドレス」となる 例:  CODE(0xbb5b48), HASH(0xbb59f8)近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  128. 128. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される 例えば print 文の引数として使った場合 具体的には「型名+ 16 進表記のアドレス」となる 例:  CODE(0xbb5b48), HASH(0xbb59f8) eq 演算子を使って、リファレンスの等価性(=同 じものを指す)をチェ ックできる近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  129. 129. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される 例えば print 文の引数として使った場合 具体的には「型名+ 16 進表記のアドレス」となる 例:  CODE(0xbb5b48), HASH(0xbb59f8) eq 演算子を使って、リファレンスの等価性(=同 じものを指す)をチェ ックできる 文字列からリファレンスへの逆変換は不可近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  130. 130. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  131. 131. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける ブロックは正しいリファレンス値を返さなければ ならない近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  132. 132. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける ブロックは正しいリファレンス値を返さなければ ならない スカラーのデリファレンス ${$sref}近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  133. 133. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける ブロックは正しいリファレンス値を返さなければ ならない スカラーのデリファレンス ${$sref} 関数を呼び出すこともできる @{&get_array_ref()}近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  134. 134. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける ブロックは正しいリファレンス値を返さなければ ならない スカラーのデリファレンス ${$sref} 関数を呼び出すこともできる @{&get_array_ref()} ${$a[2]}と$$a[2] の違いに注意 $$a[2] は${$a}[2] と解釈される近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  135. 135. ${$a[2]} と$$a[2] の違い 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 39 / 57
  136. 136. -> によるデリファレンス $a->[3] は$$a[3] を表す近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 40 / 57
  137. 137. -> によるデリファレンス $a->[3] は$$a[3] を表す $h->{key}は$$h{key}を表す近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 40 / 57
  138. 138. -> によるデリファレンス $a->[3] は$$a[3] を表す $h->{key}は$$h{key}を表す $f->($param) は&$f($param) を表す近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 40 / 57
  139. 139. -> によるデリファレンス $a->[3] は$$a[3] を表す $h->{key}は$$h{key}を表す $f->($param) は&$f($param) を表す 多次元配列を表現する $a->[3]->[2]近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 40 / 57
  140. 140. -> によるデリファレンス $a->[3] は$$a[3] を表す $h->{key}は$$h{key}を表す $f->($param) は&$f($param) を表す 多次元配列を表現する $a->[3]->[2] ->の両側が [],{}、() の場合、->を省略できる $a->[3]->[2] は$a->[2][3] と書ける近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 40 / 57
  141. 141. 多次元配列のエミュレーション $a[3][2][5] のように書けば、あたかも多次元配 列のように使える近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 41 / 57
  142. 142. 多次元配列のエミュレーション $a[3][2][5] のように書けば、あたかも多次元配 列のように使える これは実際は$a[3]->[2]->[5] である近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 41 / 57
  143. 143. 多次元配列のエミュレーション $a[3][2][5] のように書けば、あたかも多次元配 列のように使える これは実際は$a[3]->[2]->[5] である $a->[3][2][5] との違いに注意近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 41 / 57
  144. 144. $a[2][1] と$a->[2][1] の違い 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 42 / 57
  145. 145. 無名配列、無名ハッシュの自動生成 Perl では、配列の大きさを宣言する必要はない 要素に値を代入すると、自動的に配列の領域が確保さ れる近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 43 / 57
  146. 146. 無名配列、無名ハッシュの自動生成 Perl では、配列の大きさを宣言する必要はない 要素に値を代入すると、自動的に配列の領域が確保さ れる $a[2][3] のような多次元配列風記法でも同様に、 自動的に無名配列、無名ハッシュが生成される近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 43 / 57
  147. 147. 無名配列、無名ハッシュの自動生成 Perl では、配列の大きさを宣言する必要はない 要素に値を代入すると、自動的に配列の領域が確保さ れる $a[2][3] のような多次元配列風記法でも同様に、 自動的に無名配列、無名ハッシュが生成される $a[2][1] = 100 を実行すると、下のような配列の 実体が確保される近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 43 / 57
  148. 148. 無名配列、無名ハッシュ近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 44 / 57
  149. 149. 配列リファレンスを取得するには 配列リファレンスを受け取る関数 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; }近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 45 / 57
  150. 150. 配列リファレンスを取得するには 配列リファレンスを受け取る関数 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) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 45 / 57
  151. 151. 無名配列 Perl は、無名配列 (anonymous array) がサポート している ブラケット [] で要素を囲んで指定する 無名の配列が生成されて、それへのリファレンスが返 される近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 46 / 57
  152. 152. 無名配列 Perl は、無名配列 (anonymous array) がサポート している ブラケット [] で要素を囲んで指定する 無名の配列が生成されて、それへのリファレンスが返 される 例) 5 要素の名前のない配列へのリファレンスを$aref に 代入 $aref = [1, 2, 3, 4, 5]近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 46 / 57
  153. 153. 無名配列 Perl は、無名配列 (anonymous array) がサポート している ブラケット [] で要素を囲んで指定する 無名の配列が生成されて、それへのリファレンスが返 される 例) 5 要素の名前のない配列へのリファレンスを$aref に 代入 $aref = [1, 2, 3, 4, 5]近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 46 / 57
  154. 154. 無名配列 関数 compute_sum を呼び出す print "Total: ", compute_sum([1, 3, 5, 7, 9]), "n";近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 47 / 57
  155. 155. 無名配列 関数 compute_sum を呼び出す print "Total: ", compute_sum([1, 3, 5, 7, 9]), "n"; リスト (1, 2, 3) と無名配列 [1, 2, 3] を混同しない こと近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 47 / 57
  156. 156. 無名ハッシュ ハッシュに関しては、無名ハッシュ(anonymous hash)がある ブレース{}で要素を囲んで指定する 要素は「キー、値」のペアで指定する 無名のハッシュが生成されて、それへのリファレンス が返される近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 48 / 57
  157. 157. 無名ハッシュ ハッシュに関しては、無名ハッシュ(anonymous hash)がある ブレース{}で要素を囲んで指定する 要素は「キー、値」のペアで指定する 無名のハッシュが生成されて、それへのリファレンス が返される 例) キーと値のペアを 3 個持った名前のないハッ シュへのリファレンス $href = {one => 1, two => 2, three => 3};近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 48 / 57
  158. 158. ハッシュと=> =>は太い矢印 (thick arrow) と呼ばれる (「初めての Perl」p@@@@)近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 49 / 57
  159. 159. ハッシュと=> =>は太い矢印 (thick arrow) と呼ばれる (「初めての Perl」p@@@@) 基本的には、カンマと同じ意味近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 49 / 57
  160. 160. ハッシュと=> =>は太い矢印 (thick arrow) と呼ばれる (「初めての Perl」p@@@@) 基本的には、カンマと同じ意味 =>の左側に英数字と下線のみの文字列 (先頭は数字以 外) を置く場合、クォートを省略可— 前ページの例 $href = {one => 1, two => 2, three => 3};近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 49 / 57
  161. 161. ハッシュと=> =>は太い矢印 (thick arrow) と呼ばれる (「初めての Perl」p@@@@) 基本的には、カンマと同じ意味 =>の左側に英数字と下線のみの文字列 (先頭は数字以 外) を置く場合、クォートを省略可— 前ページの例 $href = {one => 1, two => 2, three => 3}; カンマを使うと次のようになる $href = {’one’, 1, ’two’, 2, ’three’, 3 };近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 49 / 57
  162. 162. ハッシュと=> =>は太い矢印 (thick arrow) と呼ばれる (「初めての Perl」p@@@@) 基本的には、カンマと同じ意味 =>の左側に英数字と下線のみの文字列 (先頭は数字以 外) を置く場合、クォートを省略可— 前ページの例 $href = {one => 1, two => 2, three => 3}; カンマを使うと次のようになる $href = {’one’, 1, ’two’, 2, ’three’, 3 }; キーと値の対応が明確になるので、ハッシュを記 述する場合には=>を使うのが普通近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 49 / 57
  163. 163. ハッシュと=> =>は太い矢印 (thick arrow) と呼ばれる (「初めての Perl」p@@@@) 基本的には、カンマと同じ意味 =>の左側に英数字と下線のみの文字列 (先頭は数字以 外) を置く場合、クォートを省略可— 前ページの例 $href = {one => 1, two => 2, three => 3}; カンマを使うと次のようになる $href = {’one’, 1, ’two’, 2, ’three’, 3 }; キーと値の対応が明確になるので、ハッシュを記 述する場合には=>を使うのが普通 (キーをクォートしないで済むので楽ちん)近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 49 / 57
  164. 164. 無名配列と無名ハッシュを組み合わせる 自由に組み合わせることができる。 (C風の) 構造体やオブジェクトを表現するのに無 名ハッシュを使うのが定石 my $userinfo = { name => $name, uid => $uid, gid => [1, 200, 201, 203], env => { HOME => $ENV{HOME}, TERM => "VT100" } };近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 50 / 57
  165. 165. Data::Dumper モジュール リファレンスで複雑なデータ構造を作れるのはい いけど、表示するにはどうするの? 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 51 / 57
  166. 166. Data::Dumper モジュール リファレンスで複雑なデータ構造を作れるのはい いけど、表示するにはどうするの? 単にプリントすると HASH(0x116360) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 51 / 57
  167. 167. Data::Dumper モジュール リファレンスで複雑なデータ構造を作れるのはい いけど、表示するにはどうするの? 単にプリントすると HASH(0x116360) そこで Data::Dumper モジュールの出番です。 $VAR1 = { ’uid’ => 1001, ’env’ => { ’HOME’ => ’/home/cond’, ’TERM’ => ’VT100’ }, ’name’ => ’John’, ’gid’ => [ 1, 200, 201, 203 ] }; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 51 / 57
  168. 168. 無名サブルーチン (コードレフ)、ク ロージャ近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 52 / 57
  169. 169. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  170. 170. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている sub { ..... }と書く近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  171. 171. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている sub { ..... }と書く 無名のサブルーチンが生成されて、それへのリファレ ンスが返される近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  172. 172. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている sub { ..... }と書く 無名のサブルーチンが生成されて、それへのリファレ ンスが返される 無名サブルーチンのリファレンスを fref に代入 $fref = sub { print "Hello, $_[0]n"; }近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  173. 173. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている sub { ..... }と書く 無名のサブルーチンが生成されて、それへのリファレ ンスが返される 無名サブルーチンのリファレンスを fref に代入 $fref = sub { print "Hello, $_[0]n"; } 無名サブルーチンを呼び出す &$fref("world");近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  174. 174. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている sub { ..... }と書く 無名のサブルーチンが生成されて、それへのリファレ ンスが返される 無名サブルーチンのリファレンスを fref に代入 $fref = sub { print "Hello, $_[0]n"; } 無名サブルーチンを呼び出す &$fref("world"); ->を使って、無名サブルーチンを呼び出す (こちら の書き方が好まれる) $fref->("world");近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  175. 175. クロージャ クロージャ(closure) とは? 無名サブルーチンを生成する際に、その時点で見える レキシカル変数 (my 変数) の実体も閉じ込められ る。これをクロージャと言う。近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 54 / 57
  176. 176. 関数 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"; # 11print $add20->(10), "n"; # 30print $add1->(30), "n"; # 31 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 55 / 57
  177. 177. 関数 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"; # 1print $bar->(), "n"; # 101print $bar->(), "n"; # 102print $foo->(), "n"; # 2print $bar->(), "n"; # 103print $foo->(), "n"; # 3 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 56 / 57
  178. 178. ご静聴ありがとうございました近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 57 / 57

×