Perlの勘所をマスターしよう! コンテキストとリファレンスを我が物に! | PPT | Free Download
SlideShare a Scribd company logo
.
     Perl の勘所をマスターしよう!
.
  コンテキストとリファレンスを我が物に!

                                      近藤 嘉雪
                                     @yoshiyuki kondo

                               YAPC::Asia 2012 (2012/9/29)




    近藤 嘉雪 (@yoshiyuki kondo)      コンテキストとリファレンスを我が物に!        YAPC::Asia 2012 (2012/9/29)   1 / 57
自己紹介
      近藤 嘉雪 (こんどう よしゆき)




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   2 / 57
自己紹介
      近藤 嘉雪 (こんどう よしゆき)
      Twitter: @yoshiyuki_kondo




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   2 / 57
自己紹介
      近藤 嘉雪 (こんどう よしゆき)
      Twitter: @yoshiyuki_kondo
      ホームページ
               http://www.kondoyoshiyuki.com/




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   2 / 57
自己紹介
      近藤 嘉雪 (こんどう よしゆき)
      Twitter: @yoshiyuki_kondo
      ホームページ
               http://www.kondoyoshiyuki.com/
      訳書
               「プログラミング Perl」
               「初めての Perl」




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   2 / 57
自己紹介
      近藤 嘉雪 (こんどう よしゆき)
      Twitter: @yoshiyuki_kondo
      ホームページ
               http://www.kondoyoshiyuki.com/
      訳書
               「プログラミング Perl」
               「初めての Perl」
      著書
               「定本 C プログラマのためのアルゴリズムとデータ
               構造」
               「定本 Java プログラマのためのアルゴリズムとデー
               タ構造」


近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   2 / 57
自己紹介
      近藤 嘉雪 (こんどう よしゆき)
      Twitter: @yoshiyuki_kondo
      ホームページ
               http://www.kondoyoshiyuki.com/
      訳書
               「プログラミング Perl」
               「初めての Perl」
      著書
               「定本 C プログラマのためのアルゴリズムとデータ
               構造」
               「定本 Java プログラマのためのアルゴリズムとデー
               タ構造」
      ヤフー株式会社で働いています
近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   2 / 57
好きなもの:




近藤 嘉雪 (@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/9/29)   3 / 57
好きなもの:
      エディタ:
               Emacs
      日本語入力方式:
               T-Code (2 ストローク直接入力)




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   3 / 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 / 57
本日お話する内容

      コンテキスト
      リファレンス
      以上




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   4 / 57
コンテキストの話




近藤 嘉雪 (@yoshiyuki kondo)    コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   5 / 57
コンテキストとは?
      式を評価する際に、スカラー値とリスト値のどち
      らを期待しているか、ということ




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   6 / 57
コンテキストとは?
      式を評価する際に、スカラー値とリスト値のどち
      らを期待しているか、ということ
      スカラーコンテキストはスカラー値を期待




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   6 / 57
コンテキストとは?
      式を評価する際に、スカラー値とリスト値のどち
      らを期待しているか、ということ
      スカラーコンテキストはスカラー値を期待
      リストコンテキストはリスト値を期待




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   6 / 57
コンテキストとは?
      式を評価する際に、スカラー値とリスト値のどち
      らを期待しているか、ということ
      スカラーコンテキストはスカラー値を期待
      リストコンテキストはリスト値を期待
      「スカラー変数への代入は、スカラーコンテキス
      トを与える」などと言う




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   6 / 57
コンテキストとは?
      式を評価する際に、スカラー値とリスト値のどち
      らを期待しているか、ということ
      スカラーコンテキストはスカラー値を期待
      リストコンテキストはリスト値を期待
      「スカラー変数への代入は、スカラーコンテキス
      トを与える」などと言う
      操作、演算子、関数の中には、コンテキストに応
      じて違う値を返すものがある




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   6 / 57
ほかのコンテキスト (1)
      無効コンテキスト (void context)




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   7 / 57
ほかのコンテキスト (1)
      無効コンテキスト (void context)
               値を必要としない場所




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   7 / 57
ほかのコンテキスト (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
ほかのコンテキスト (2)
      スカラーコンテキストはさらに分類される




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   8 / 57
ほかのコンテキスト (2)
      スカラーコンテキストはさらに分類される
      文字列コンテキスト (string context)
               . 演算子、x の左側、ne、lt など




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   8 / 57
ほかのコンテキスト (2)
      スカラーコンテキストはさらに分類される
      文字列コンテキスト (string context)
               . 演算子、x の左側、ne、lt など
      数値コンテキスト (numeric context)
               +, -, *, /など




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   8 / 57
ほかのコンテキスト (2)
      スカラーコンテキストはさらに分類される
      文字列コンテキスト (string context)
               . 演算子、x の左側、ne、lt など
      数値コンテキスト (numeric context)
               +, -, *, /など
      不定コンテキスト (don’t care context)
               どっちでもいいよ




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   8 / 57
ほかのコンテキスト (2)
      スカラーコンテキストはさらに分類される
      文字列コンテキスト (string context)
               . 演算子、x の左側、ne、lt など
      数値コンテキスト (numeric context)
               +, -, *, /など
      不定コンテキスト (don’t care context)
               どっちでもいいよ
      ブール値コンテキスト (boolean context)
               不定コンテキストの一種
               条件式




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   8 / 57
リストコンテキストを与える場所 (1)




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   9 / 57
リストコンテキストを与える場所 (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
リストコンテキストを与える場所 (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
リストコンテキストを与える場所 (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
リストコンテキストを与える場所 (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
リストコンテキストを与える場所 (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
リストコンテキストを与える場所 (2)




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   10 / 57
リストコンテキストを与える場所 (2)
      リストコンテキスト以外の場所はスカラーコンテ
      キストとなる




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   10 / 57
リストコンテキストを与える場所 (2)
      リストコンテキスト以外の場所はスカラーコンテ
      キストとなる
      scalar 関数によって、強制的にスカラーコンテキ
      ストを適用できる




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   10 / 57
リストコンテキストを与える場所 (2)
      リストコンテキスト以外の場所はスカラーコンテ
      キストとなる
      scalar 関数によって、強制的にスカラーコンテキ
      ストを適用できる
      my や our 宣言は、コンテキストに影響を与えない
      my $x                = func();   # スカラーコンテキスト
      my ($x, $y)          = func();   # リストコンテキスト
      my (@a)              = func();   # リストコンテキスト




近藤 嘉雪 (@yoshiyuki kondo)      コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   10 / 57
リストコンテキストを与える場所 (3)
      Perl 関連のドキュメントで LIST と書いてあると
      ころ。
               perl のマニュアルページ、ラクダ本
               man perlfunc, man perlop




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   11 / 57
リストコンテキストを与える場所 (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
リストコンテキストを与える場所 (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
コンテキストによって異なる値を返すもの:
配列変数名
      配列変数名




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   12 / 57
コンテキストによって異なる値を返すもの:
配列変数名
      配列変数名
      リストコンテキストでは、配列の要素から成るリ
      スト値を返す




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   12 / 57
コンテキストによって異なる値を返すもの:
配列変数名
      配列変数名
      リストコンテキストでは、配列の要素から成るリ
      スト値を返す
      スカラーコンテキストでは、配列の要素の個数を
      返す




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   12 / 57
コンテキストによって異なる値を返すもの:
配列変数名
      配列変数名
      リストコンテキストでは、配列の要素から成るリ
      スト値を返す
      スカラーコンテキストでは、配列の要素の個数を
      返す
      # リストコンテキスト  @b の内容が@a にコピーされる
      @a = @b;

      # スカラーコンテキスト @b の要素の個数が$n に入る
      $n = @b;




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   12 / 57
配列名とコンテキストの落とし穴
      サブルーチン、組込関数の引数リストは、リスト
      コンテキストで評価される
      @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
配列名とコンテキストの落とし穴
      サブルーチン、組込関数の引数リストは、リスト
      コンテキストで評価される
      @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
リストからスカラー変数への代入にご用心
      リストと配列の違いに注意
      a=one two three と表示される
      @a = (’one’, ’two’, ’three’);
      print "a=@an";




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   14 / 57
リストからスカラー変数への代入にご用心
      リストと配列の違いに注意
      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
リストからスカラー変数への代入にご用心
      リストと配列の違いに注意
      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
コンテキストによって異なる値を返すもの:
入力演算子 <>
      入力演算子 <>




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   15 / 57
コンテキストによって異なる値を返すもの:
入力演算子 <>
      入力演算子 <>
      スカラーコンテキストでは、次の1行を返す
      $line = <INPUT>;




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   15 / 57
コンテキストによって異なる値を返すもの:
入力演算子 <>
      入力演算子 <>
      スカラーコンテキストでは、次の1行を返す
      $line = <INPUT>;
      リストコンテキストでは、残りのすべての行を読
      んでリストにして返す
      @date = <INPUT>;




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   15 / 57
コンテキストによって異なる値を返すもの:
入力演算子 <>
      入力演算子 <>
      スカラーコンテキストでは、次の1行を返す
      $line = <INPUT>;
      リストコンテキストでは、残りのすべての行を読
      んでリストにして返す
      @date = <INPUT>;
      次の1行を読み込んで表示するには
      print <INPUT>;                  # ダメ
      print scalar(<INPUT>);          # OK




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   15 / 57
ここで注意!
      リスト値を返す関数を、スカラーコンテキストで
      評価すると、返すリストの個数を返す *わけでは
      ない* ので注意。




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   16 / 57
ここで注意!
      リスト値を返す関数を、スカラーコンテキストで
      評価すると、返すリストの個数を返す *わけでは
      ない* ので注意。
      答えは、それぞれ関数によって、スカラーコンテ
      キストで筋が通った (と考える) 値を返す。
               これについては、この後すぐに…




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   16 / 57
コンテキストによって動作が変わる関数 (1)
      コンテキストによって、違う値を返す組み込み関
      数は、マニュアルにそのように明記されている。
      「perldoc -f 関数名」で組み込み関数のマニュアル
      が表示されます。




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   17 / 57
getpwnam 関数
       ユーザ名を受け取り、そのユーザに関する情報を
       返す




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   18 / 57
getpwnam 関数
       ユーザ名を受け取り、そのユーザに関する情報を
       返す
       リストコンテキストでは、/etc/passwd の情報をリ
       スト値で返す
       ($name,$passwd,$uid,$gid,$quota,$comment,
         $gcos,$dir,$shell,$expire) = getpwnam




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   18 / 57
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
localtime 関数
       いわゆる Unix time 値を、年月日時分秒に変換し
       て返す




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   19 / 57
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
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
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
reverse 関数
       リストコンテキストでは、渡されたリストを逆順
       にしたリストを返す




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   20 / 57
reverse 関数
       リストコンテキストでは、渡されたリストを逆順
       にしたリストを返す
       Q: スカラーコンテキストでは何を返す?




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   20 / 57
reverse 関数
       リストコンテキストでは、渡されたリストを逆順
       にしたリストを返す
       Q: スカラーコンテキストでは何を返す?
       A: 引数を文字列として連結して、その文字列を逆
       順にした文字列を返す




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   20 / 57
reverse 関数をスカラーコンテキストで評価す
ると
      引数を文字列として連結して、その文字列を逆順
      にした文字列を返す




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   21 / 57
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
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
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
番外: chomp 演算子
       文字列の末尾に改行文字があればそれを削除する




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   22 / 57
番外: chomp 演算子
       文字列の末尾に改行文字があればそれを削除する
       引数には、左辺値 (スカラー変数や配列要素) を
       渡す




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   22 / 57
番外: chomp 演算子
       文字列の末尾に改行文字があればそれを削除する
       引数には、左辺値 (スカラー変数や配列要素) を
       渡す
       リストを渡すと、すべての要素から、末尾の改行
       文字を取り除く




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   22 / 57
番外: chomp 演算子
       文字列の末尾に改行文字があればそれを削除する
       引数には、左辺値 (スカラー変数や配列要素) を
       渡す
       リストを渡すと、すべての要素から、末尾の改行
       文字を取り除く
       配列を渡すと、一括して chomp できる
       my @lines = <>;
       chomp(@lines);




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   22 / 57
番外: chomp 演算子
       文字列の末尾に改行文字があればそれを削除する
       引数には、左辺値 (スカラー変数や配列要素) を
       渡す
       リストを渡すと、すべての要素から、末尾の改行
       文字を取り除く
       配列を渡すと、一括して chomp できる
       my @lines = <>;
       chomp(@lines);
       イディオムとして次のように書く
       chomp(my @lines = <>);



 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   22 / 57
コンテキストに応じてサブルーチンの動作を
変える
      サブルーチンの中で wantarray 関数を呼び出すと、
      コンテキストを識別できる




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   23 / 57
コンテキストに応じてサブルーチンの動作を
変える
      サブルーチンの中で wantarray 関数を呼び出すと、
      コンテキストを識別できる
               リストコンテキストなら真
               スカラーコンテキストなら偽




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   23 / 57
コンテキストに応じてサブルーチンの動作を
変える
      サブルーチンの中で wantarray 関数を呼び出すと、
      コンテキストを識別できる
               リストコンテキストなら真
               スカラーコンテキストなら偽
      wantarray の返り値によって、戻り値を変える
      sub mysub {
          my @ans;         # 処理の結果がここに入る

            # コンテキストに応じて返す値を変える
            return wantarray ? @ans : "@ans";
      }




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   23 / 57
コンテキストに応じてサブルーチンの動作を
変える
      サブルーチンの中で 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
コンテキストに応じてサブルーチンの動作を
変える
      サブルーチンの中で 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
//演算子とコンテキスト (1)
       スカラーコンテキストでは、マッチしたか否かを
       示す。




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   24 / 57
//演算子とコンテキスト (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
//演算子とコンテキスト (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
//演算子とコンテキスト (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
//演算子とコンテキスト (2)
       マッチの結果を、スカラー変数のリストに代入
       する




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   25 / 57
//演算子とコンテキスト (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
//演算子とコンテキスト (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
//演算子とコンテキスト (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
//演算子とコンテキスト (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
//演算子とコンテキスト (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
リファレンス




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   26 / 57
リファレンスとは?
      リファレンス(reference)は、他のデータを指す
      データ型である
               スカラー型の一種




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   27 / 57
リファレンスとは?
      リファレンス(reference)は、他のデータを指す
      データ型である
               スカラー型の一種
      C 言語のポインタに相当するもの




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   27 / 57
リファレンスとは?
      リファレンス(reference)は、他のデータを指す
      データ型である
               スカラー型の一種
      C 言語のポインタに相当するもの
      リファレンスを利用して、複雑なデータ構造を表
      現できる
               連結リスト、木構造、グラフ etc.




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   27 / 57
変数へのリファレンスを得る
      変数の前に逆スラッシュをつけると、リファレン
      スが得られる
               C の単項&演算子に相当
               $scaler_ref = $scalar;           # スカラー




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!    YAPC::Asia 2012 (2012/9/29)   28 / 57
変数へのリファレンスを得る
      変数の前に逆スラッシュをつけると、リファレン
      スが得られる
               C の単項&演算子に相当
               $scaler_ref = $scalar;           # スカラー
               $array_ref     = @array;         # 配列




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!    YAPC::Asia 2012 (2012/9/29)   28 / 57
変数へのリファレンスを得る
      変数の前に逆スラッシュをつけると、リファレン
      スが得られる
               C の単項&演算子に相当
               $scaler_ref = $scalar;           # スカラー
               $array_ref     = @array;         # 配列
               $hash_ref      = %hash;          # ハッシュ




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!    YAPC::Asia 2012 (2012/9/29)   28 / 57
変数へのリファレンスを得る
      変数の前に逆スラッシュをつけると、リファレン
      スが得られる
               C の単項&演算子に相当
               $scaler_ref = $scalar;           # スカラー
               $array_ref     = @array;         # 配列
               $hash_ref      = %hash;          # ハッシュ
               $func_ref      = &function;      # サブルーチン




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!    YAPC::Asia 2012 (2012/9/29)   28 / 57
変数へのリファレンスを得る
      変数の前に逆スラッシュをつけると、リファレン
      スが得られる
               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
変数へのリファレンスを得る
      変数の前に逆スラッシュをつけると、リファレン
      スが得られる
               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
デリファレンス
      リファレンスをたどって、指しているデータにア
      クセスすることをデリファレンス(dereference)
      という




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   29 / 57
デリファレンス
      リファレンスをたどって、指しているデータにア
      クセスすることをデリファレンス(dereference)
      という
      Perl では、変数の種別を表すプレフィクス文字$、
      @、%、&などを使う
               これらの文字をシジル (sigil) という
               C では単項の*によってデリファレンスを行う




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   29 / 57
スカラーのデリファレンス
      デリファレンスした結果はその型の変数として扱
      える




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   30 / 57
スカラーのデリファレンス
      デリファレンスした結果はその型の変数として扱
      える
      スカラーへのリファレンスを取得
      $sref = $x;




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   30 / 57
スカラーのデリファレンス
      デリファレンスした結果はその型の変数として扱
      える
      スカラーへのリファレンスを取得
      $sref = $x;
      スカラー値にアクセスする
      $a = $$ref;




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   30 / 57
スカラーのデリファレンス
      デリファレンスした結果はその型の変数として扱
      える
      スカラーへのリファレンスを取得
      $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
配列のデリファレンス




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   31 / 57
配列のデリファレンス
      配列へのリファレンスを取得する
      $array_ref = @array;




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   31 / 57
配列のデリファレンス
      配列へのリファレンスを取得する
      $array_ref = @array;

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




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   31 / 57
配列のデリファレンス
      配列へのリファレンスを取得する
      $array_ref = @array;

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




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   31 / 57
配列のデリファレンス
      配列へのリファレンスを取得する
      $array_ref = @array;

      配列全体にアクセス
      @s = @$array_ref;
      配列の要素にアクセス
      $$array_ref[10] = 10;
      foreach 文で配列の要素を順に処理する
      foreach (@$array_ref) {




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   31 / 57
配列のデリファレンスの例
      関数 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
ハッシュのデリファレンス




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   33 / 57
ハッシュのデリファレンス
      ハッシュへのリファレンスを取得する
      $href = %h;




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   33 / 57
ハッシュのデリファレンス
      ハッシュへのリファレンスを取得する
      $href = %h;

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




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   33 / 57
ハッシュのデリファレンス
      ハッシュへのリファレンスを取得する
      $href = %h;

      ハッシュの要素にアクセス
      $x = $$href{’a’};
      keys 関数で、ハッシュのすべてのキーを取り出す
      foreach (keys %$href) {




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   33 / 57
サブルーチンのデリファレンス
      コードレフ (coderef) とも呼ばれる




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   34 / 57
サブルーチンのデリファレンス
      コードレフ (coderef) とも呼ばれる
      サブルーチンへのリファレンスを取得する
      $fref = &func;




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   34 / 57
サブルーチンのデリファレンス
      コードレフ (coderef) とも呼ばれる
      サブルーチンへのリファレンスを取得する
      $fref = &func;

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




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   34 / 57
デリファレンスの失敗
      リファレンスの本来の型以外にデリファレンスし
      ようとするとエラーになる
      $aref = @array;
      $$aref = 10;
               Not a SCALAR reference at - line 7.




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!       YAPC::Asia 2012 (2012/9/29)   35 / 57
ref 関数
       引数がリファレンスなら真、そうでなければ偽を
       返す
       真の値は、リファレンスが指すものの種類を示す
       文字列
                            リファレンス      REF
                            スカラー        SCALAR
                            配列          ARRAY
                            ハッシュ        HASH
                            サブルーチン      CODE
                            型グロブ        GLOB
                            オブジェクト      所属するクラス名




 近藤 嘉雪 (@yoshiyuki kondo)    コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   36 / 57
リファレンスから文字列への変換
      リファレンスは必要に応じて文字列に変換される




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   37 / 57
リファレンスから文字列への変換
      リファレンスは必要に応じて文字列に変換される
               例えば print 文の引数として使った場合




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   37 / 57
リファレンスから文字列への変換
      リファレンスは必要に応じて文字列に変換される
               例えば print 文の引数として使った場合
      具体的には「型名+ 16 進表記のアドレス」となる
               例:  CODE(0xbb5b48), HASH(0xbb59f8)




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   37 / 57
リファレンスから文字列への変換
      リファレンスは必要に応じて文字列に変換される
               例えば print 文の引数として使った場合
      具体的には「型名+ 16 進表記のアドレス」となる
               例:  CODE(0xbb5b48), HASH(0xbb59f8)
      eq 演算子を使って、リファレンスの等価性(=同
      じものを指す)をチェ  ックできる




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   37 / 57
リファレンスから文字列への変換
      リファレンスは必要に応じて文字列に変換される
               例えば print 文の引数として使った場合
      具体的には「型名+ 16 進表記のアドレス」となる
               例:  CODE(0xbb5b48), HASH(0xbb59f8)
      eq 演算子を使って、リファレンスの等価性(=同
      じものを指す)をチェ  ックできる
      文字列からリファレンスへの逆変換は不可




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   37 / 57
ブロックを使ったデリファレンス
      変数名やサブルーチン名のうち、英数字の識別子
      の変わりにブロックを置ける




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   38 / 57
ブロックを使ったデリファレンス
      変数名やサブルーチン名のうち、英数字の識別子
      の変わりにブロックを置ける
      ブロックは正しいリファレンス値を返さなければ
      ならない




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   38 / 57
ブロックを使ったデリファレンス
      変数名やサブルーチン名のうち、英数字の識別子
      の変わりにブロックを置ける
      ブロックは正しいリファレンス値を返さなければ
      ならない
      スカラーのデリファレンス
      ${$sref}




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   38 / 57
ブロックを使ったデリファレンス
      変数名やサブルーチン名のうち、英数字の識別子
      の変わりにブロックを置ける
      ブロックは正しいリファレンス値を返さなければ
      ならない
      スカラーのデリファレンス
      ${$sref}
      関数を呼び出すこともできる
      @{&get_array_ref()}




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   38 / 57
ブロックを使ったデリファレンス
      変数名やサブルーチン名のうち、英数字の識別子
      の変わりにブロックを置ける
      ブロックは正しいリファレンス値を返さなければ
      ならない
      スカラーのデリファレンス
      ${$sref}
      関数を呼び出すこともできる
      @{&get_array_ref()}
      ${$a[2]}と$$a[2] の違いに注意
               $$a[2] は${$a}[2] と解釈される



近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   38 / 57
${$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::Asia 2012 (2012/9/29)   40 / 57
-> によるデリファレンス
      $a->[3] は$$a[3] を表す
      $h->{key}は$$h{key}を表す
      $f->($param) は&$f($param) を表す




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   40 / 57
-> によるデリファレンス
      $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
-> によるデリファレンス
      $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
多次元配列のエミュレーション
      $a[3][2][5] のように書けば、あたかも多次元配
      列のように使える




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   41 / 57
多次元配列のエミュレーション
      $a[3][2][5] のように書けば、あたかも多次元配
      列のように使える
      これは実際は$a[3]->[2]->[5] である




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   41 / 57
多次元配列のエミュレーション
      $a[3][2][5] のように書けば、あたかも多次元配
      列のように使える
      これは実際は$a[3]->[2]->[5] である
      $a->[3][2][5] との違いに注意




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   41 / 57
$a[2][1] と$a->[2][1] の違い




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   42 / 57
無名配列、無名ハッシュの自動生成
      Perl では、配列の大きさを宣言する必要はない
               要素に値を代入すると、自動的に配列の領域が確保さ
               れる




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   43 / 57
無名配列、無名ハッシュの自動生成
      Perl では、配列の大きさを宣言する必要はない
               要素に値を代入すると、自動的に配列の領域が確保さ
               れる
      $a[2][3] のような多次元配列風記法でも同様に、
      自動的に無名配列、無名ハッシュが生成される




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   43 / 57
無名配列、無名ハッシュの自動生成
      Perl では、配列の大きさを宣言する必要はない
               要素に値を代入すると、自動的に配列の領域が確保さ
               れる
      $a[2][3] のような多次元配列風記法でも同様に、
      自動的に無名配列、無名ハッシュが生成される
      $a[2][1] = 100 を実行すると、下のような配列の
                    実体が確保される




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   43 / 57
無名配列、無名ハッシュ




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   44 / 57
配列リファレンスを取得するには
      配列リファレンスを受け取る関数 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
配列リファレンスを取得するには
      配列リファレンスを受け取る関数 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
無名配列
      Perl は、無名配列 (anonymous array) がサポート
      している
               ブラケット [] で要素を囲んで指定する
               無名の配列が生成されて、それへのリファレンスが返
               される




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   46 / 57
無名配列
      Perl は、無名配列 (anonymous array) がサポート
      している
               ブラケット [] で要素を囲んで指定する
               無名の配列が生成されて、それへのリファレンスが返
               される
      例)
               5 要素の名前のない配列へのリファレンスを$aref に
               代入
               $aref = [1, 2, 3, 4, 5]




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   46 / 57
無名配列
      Perl は、無名配列 (anonymous array) がサポート
      している
               ブラケット [] で要素を囲んで指定する
               無名の配列が生成されて、それへのリファレンスが返
               される
      例)
               5 要素の名前のない配列へのリファレンスを$aref に
               代入
               $aref = [1, 2, 3, 4, 5]




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   46 / 57
無名配列
      関数 compute_sum を呼び出す
      print "Total: ", compute_sum([1, 3, 5, 7, 9]), "n";




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   47 / 57
無名配列
      関数 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
無名ハッシュ
      ハッシュに関しては、無名ハッシュ(anonymous
      hash)がある
               ブレース{}で要素を囲んで指定する
               要素は「キー、値」のペアで指定する
               無名のハッシュが生成されて、それへのリファレンス
               が返される




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   48 / 57
無名ハッシュ
      ハッシュに関しては、無名ハッシュ(anonymous
      hash)がある
               ブレース{}で要素を囲んで指定する
               要素は「キー、値」のペアで指定する
               無名のハッシュが生成されて、それへのリファレンス
               が返される
      例) キーと値のペアを 3 個持った名前のないハッ
      シュへのリファレンス
      $href = {one => 1, two => 2, three => 3};




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   48 / 57
ハッシュと=>
      =>は太い矢印 (thick arrow) と呼ばれる (「初めての
      Perl」p@@@@)




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   49 / 57
ハッシュと=>
      =>は太い矢印 (thick arrow) と呼ばれる (「初めての
      Perl」p@@@@)
               基本的には、カンマと同じ意味




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   49 / 57
ハッシュと=>
      =>は太い矢印 (thick arrow) と呼ばれる (「初めての
      Perl」p@@@@)
               基本的には、カンマと同じ意味
               =>の左側に英数字と下線のみの文字列 (先頭は数字以
               外) を置く場合、クォートを省略可—
               前ページの例
               $href = {one => 1, two => 2, three => 3};




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   49 / 57
ハッシュと=>
      =>は太い矢印 (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
ハッシュと=>
      =>は太い矢印 (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
ハッシュと=>
      =>は太い矢印 (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
無名配列と無名ハッシュを組み合わせる
      自由に組み合わせることができる。
      (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
Data::Dumper モジュール
       リファレンスで複雑なデータ構造を作れるのはい
       いけど、表示するにはどうするの?




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   51 / 57
Data::Dumper モジュール
       リファレンスで複雑なデータ構造を作れるのはい
       いけど、表示するにはどうするの?
       単にプリントすると HASH(0x116360)




 近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   51 / 57
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
無名サブルーチン (コードレフ)、ク
      ロージャ




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   52 / 57
無名サブルーチン
      Perl は、無名サブルーチン(anonymous
      subroutine)をサポートしている




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   53 / 57
無名サブルーチン
      Perl は、無名サブルーチン(anonymous
      subroutine)をサポートしている
               sub { ..... }と書く




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   53 / 57
無名サブルーチン
      Perl は、無名サブルーチン(anonymous
      subroutine)をサポートしている
               sub { ..... }と書く
               無名のサブルーチンが生成されて、それへのリファレ
               ンスが返される




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   53 / 57
無名サブルーチン
      Perl は、無名サブルーチン(anonymous
      subroutine)をサポートしている
               sub { ..... }と書く
               無名のサブルーチンが生成されて、それへのリファレ
               ンスが返される
      無名サブルーチンのリファレンスを fref に代入
      $fref = sub { print "Hello, $_[0]n"; }




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   53 / 57
無名サブルーチン
      Perl は、無名サブルーチン(anonymous
      subroutine)をサポートしている
               sub { ..... }と書く
               無名のサブルーチンが生成されて、それへのリファレ
               ンスが返される
      無名サブルーチンのリファレンスを fref に代入
      $fref = sub { print "Hello, $_[0]n"; }
      無名サブルーチンを呼び出す
      &$fref("world");




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   53 / 57
無名サブルーチン
      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
クロージャ
      クロージャ(closure) とは?
               無名サブルーチンを生成する際に、その時点で見える
               レキシカル変数 (my 変数) の実体も閉じ込められ
               る。これをクロージャと言う。




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   54 / 57
関数 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)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   55 / 57
関数 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)       コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   56 / 57
ご静聴ありがとうございました




近藤 嘉雪 (@yoshiyuki kondo)   コンテキストとリファレンスを我が物に!   YAPC::Asia 2012 (2012/9/29)   57 / 57

More Related Content

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

  • 1. . Perl の勘所をマスターしよう! . コンテキストとリファレンスを我が物に! 近藤 嘉雪 @yoshiyuki kondo YAPC::Asia 2012 (2012/9/29) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 1 / 57
  • 2. 自己紹介 近藤 嘉雪 (こんどう よしゆき) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  • 3. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  • 4. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo ホームページ http://www.kondoyoshiyuki.com/ 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  • 5. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo ホームページ http://www.kondoyoshiyuki.com/ 訳書 「プログラミング Perl」 「初めての Perl」 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  • 6. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo ホームページ http://www.kondoyoshiyuki.com/ 訳書 「プログラミング Perl」 「初めての Perl」 著書 「定本 C プログラマのためのアルゴリズムとデータ 構造」 「定本 Java プログラマのためのアルゴリズムとデー タ構造」 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  • 7. 自己紹介 近藤 嘉雪 (こんどう よしゆき) Twitter: @yoshiyuki_kondo ホームページ http://www.kondoyoshiyuki.com/ 訳書 「プログラミング Perl」 「初めての Perl」 著書 「定本 C プログラマのためのアルゴリズムとデータ 構造」 「定本 Java プログラマのためのアルゴリズムとデー タ構造」 ヤフー株式会社で働いています 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 2 / 57
  • 8. 好きなもの: 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  • 9. 好きなもの: エディタ: 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  • 10. 好きなもの: エディタ: Emacs 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  • 11. 好きなもの: エディタ: Emacs 日本語入力方式: 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  • 12. 好きなもの: エディタ: Emacs 日本語入力方式: T-Code (2 ストローク直接入力) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 3 / 57
  • 13. 本日お話する内容 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 4 / 57
  • 14. 本日お話する内容 コンテキスト 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 4 / 57
  • 15. 本日お話する内容 コンテキスト リファレンス 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 4 / 57
  • 16. 本日お話する内容 コンテキスト リファレンス 以上 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 4 / 57
  • 17. コンテキストの話 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 5 / 57
  • 18. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  • 19. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ スカラーコンテキストはスカラー値を期待 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  • 20. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ スカラーコンテキストはスカラー値を期待 リストコンテキストはリスト値を期待 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  • 21. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ スカラーコンテキストはスカラー値を期待 リストコンテキストはリスト値を期待 「スカラー変数への代入は、スカラーコンテキス トを与える」などと言う 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  • 22. コンテキストとは? 式を評価する際に、スカラー値とリスト値のどち らを期待しているか、ということ スカラーコンテキストはスカラー値を期待 リストコンテキストはリスト値を期待 「スカラー変数への代入は、スカラーコンテキス トを与える」などと言う 操作、演算子、関数の中には、コンテキストに応 じて違う値を返すものがある 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 6 / 57
  • 23. ほかのコンテキスト (1) 無効コンテキスト (void context) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 7 / 57
  • 24. ほかのコンテキスト (1) 無効コンテキスト (void context) 値を必要としない場所 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 7 / 57
  • 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. ほかのコンテキスト (2) スカラーコンテキストはさらに分類される 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 8 / 57
  • 27. ほかのコンテキスト (2) スカラーコンテキストはさらに分類される 文字列コンテキスト (string context) . 演算子、x の左側、ne、lt など 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 8 / 57
  • 28. ほかのコンテキスト (2) スカラーコンテキストはさらに分類される 文字列コンテキスト (string context) . 演算子、x の左側、ne、lt など 数値コンテキスト (numeric context) +, -, *, /など 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 8 / 57
  • 29. ほかのコンテキスト (2) スカラーコンテキストはさらに分類される 文字列コンテキスト (string context) . 演算子、x の左側、ne、lt など 数値コンテキスト (numeric context) +, -, *, /など 不定コンテキスト (don’t care context) どっちでもいいよ 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 8 / 57
  • 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. リストコンテキストを与える場所 (1) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 9 / 57
  • 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. リストコンテキストを与える場所 (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. リストコンテキストを与える場所 (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. リストコンテキストを与える場所 (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. リストコンテキストを与える場所 (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. リストコンテキストを与える場所 (2) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 10 / 57
  • 38. リストコンテキストを与える場所 (2) リストコンテキスト以外の場所はスカラーコンテ キストとなる 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 10 / 57
  • 39. リストコンテキストを与える場所 (2) リストコンテキスト以外の場所はスカラーコンテ キストとなる scalar 関数によって、強制的にスカラーコンテキ ストを適用できる 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 10 / 57
  • 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. リストコンテキストを与える場所 (3) Perl 関連のドキュメントで LIST と書いてあると ころ。 perl のマニュアルページ、ラクダ本 man perlfunc, man perlop 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 11 / 57
  • 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. リストコンテキストを与える場所 (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. コンテキストによって異なる値を返すもの: 配列変数名 配列変数名 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 12 / 57
  • 45. コンテキストによって異なる値を返すもの: 配列変数名 配列変数名 リストコンテキストでは、配列の要素から成るリ スト値を返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 12 / 57
  • 46. コンテキストによって異なる値を返すもの: 配列変数名 配列変数名 リストコンテキストでは、配列の要素から成るリ スト値を返す スカラーコンテキストでは、配列の要素の個数を 返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 12 / 57
  • 47. コンテキストによって異なる値を返すもの: 配列変数名 配列変数名 リストコンテキストでは、配列の要素から成るリ スト値を返す スカラーコンテキストでは、配列の要素の個数を 返す # リストコンテキスト  @b の内容が@a にコピーされる @a = @b; # スカラーコンテキスト @b の要素の個数が$n に入る $n = @b; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 12 / 57
  • 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. 配列名とコンテキストの落とし穴 サブルーチン、組込関数の引数リストは、リスト コンテキストで評価される @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. リストからスカラー変数への代入にご用心 リストと配列の違いに注意 a=one two three と表示される @a = (’one’, ’two’, ’three’); print "a=@an"; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 14 / 57
  • 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. リストからスカラー変数への代入にご用心 リストと配列の違いに注意 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. コンテキストによって異なる値を返すもの: 入力演算子 <> 入力演算子 <> 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 15 / 57
  • 54. コンテキストによって異なる値を返すもの: 入力演算子 <> 入力演算子 <> スカラーコンテキストでは、次の1行を返す $line = <INPUT>; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 15 / 57
  • 55. コンテキストによって異なる値を返すもの: 入力演算子 <> 入力演算子 <> スカラーコンテキストでは、次の1行を返す $line = <INPUT>; リストコンテキストでは、残りのすべての行を読 んでリストにして返す @date = <INPUT>; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 15 / 57
  • 56. コンテキストによって異なる値を返すもの: 入力演算子 <> 入力演算子 <> スカラーコンテキストでは、次の1行を返す $line = <INPUT>; リストコンテキストでは、残りのすべての行を読 んでリストにして返す @date = <INPUT>; 次の1行を読み込んで表示するには print <INPUT>; # ダメ print scalar(<INPUT>); # OK 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 15 / 57
  • 57. ここで注意! リスト値を返す関数を、スカラーコンテキストで 評価すると、返すリストの個数を返す *わけでは ない* ので注意。 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 16 / 57
  • 58. ここで注意! リスト値を返す関数を、スカラーコンテキストで 評価すると、返すリストの個数を返す *わけでは ない* ので注意。 答えは、それぞれ関数によって、スカラーコンテ キストで筋が通った (と考える) 値を返す。 これについては、この後すぐに… 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 16 / 57
  • 59. コンテキストによって動作が変わる関数 (1) コンテキストによって、違う値を返す組み込み関 数は、マニュアルにそのように明記されている。 「perldoc -f 関数名」で組み込み関数のマニュアル が表示されます。 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 17 / 57
  • 60. getpwnam 関数 ユーザ名を受け取り、そのユーザに関する情報を 返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 18 / 57
  • 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. 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. localtime 関数 いわゆる Unix time 値を、年月日時分秒に変換し て返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 19 / 57
  • 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. 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. 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. reverse 関数 リストコンテキストでは、渡されたリストを逆順 にしたリストを返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 20 / 57
  • 68. reverse 関数 リストコンテキストでは、渡されたリストを逆順 にしたリストを返す Q: スカラーコンテキストでは何を返す? 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 20 / 57
  • 69. reverse 関数 リストコンテキストでは、渡されたリストを逆順 にしたリストを返す Q: スカラーコンテキストでは何を返す? A: 引数を文字列として連結して、その文字列を逆 順にした文字列を返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 20 / 57
  • 70. reverse 関数をスカラーコンテキストで評価す ると 引数を文字列として連結して、その文字列を逆順 にした文字列を返す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 21 / 57
  • 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. 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. 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. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  • 75. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 引数には、左辺値 (スカラー変数や配列要素) を 渡す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  • 76. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 引数には、左辺値 (スカラー変数や配列要素) を 渡す リストを渡すと、すべての要素から、末尾の改行 文字を取り除く 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  • 77. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 引数には、左辺値 (スカラー変数や配列要素) を 渡す リストを渡すと、すべての要素から、末尾の改行 文字を取り除く 配列を渡すと、一括して chomp できる my @lines = <>; chomp(@lines); 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  • 78. 番外: chomp 演算子 文字列の末尾に改行文字があればそれを削除する 引数には、左辺値 (スカラー変数や配列要素) を 渡す リストを渡すと、すべての要素から、末尾の改行 文字を取り除く 配列を渡すと、一括して chomp できる my @lines = <>; chomp(@lines); イディオムとして次のように書く chomp(my @lines = <>); 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 22 / 57
  • 79. コンテキストに応じてサブルーチンの動作を 変える サブルーチンの中で wantarray 関数を呼び出すと、 コンテキストを識別できる 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 23 / 57
  • 80. コンテキストに応じてサブルーチンの動作を 変える サブルーチンの中で wantarray 関数を呼び出すと、 コンテキストを識別できる リストコンテキストなら真 スカラーコンテキストなら偽 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 23 / 57
  • 81. コンテキストに応じてサブルーチンの動作を 変える サブルーチンの中で wantarray 関数を呼び出すと、 コンテキストを識別できる リストコンテキストなら真 スカラーコンテキストなら偽 wantarray の返り値によって、戻り値を変える sub mysub { my @ans; # 処理の結果がここに入る # コンテキストに応じて返す値を変える return wantarray ? @ans : "@ans"; } 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 23 / 57
  • 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. コンテキストに応じてサブルーチンの動作を 変える サブルーチンの中で 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. //演算子とコンテキスト (1) スカラーコンテキストでは、マッチしたか否かを 示す。 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 24 / 57
  • 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. //演算子とコンテキスト (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. //演算子とコンテキスト (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. //演算子とコンテキスト (2) マッチの結果を、スカラー変数のリストに代入 する 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 25 / 57
  • 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. //演算子とコンテキスト (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. //演算子とコンテキスト (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. //演算子とコンテキスト (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. //演算子とコンテキスト (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. リファレンス 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 26 / 57
  • 95. リファレンスとは? リファレンス(reference)は、他のデータを指す データ型である スカラー型の一種 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 27 / 57
  • 96. リファレンスとは? リファレンス(reference)は、他のデータを指す データ型である スカラー型の一種 C 言語のポインタに相当するもの 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 27 / 57
  • 97. リファレンスとは? リファレンス(reference)は、他のデータを指す データ型である スカラー型の一種 C 言語のポインタに相当するもの リファレンスを利用して、複雑なデータ構造を表 現できる 連結リスト、木構造、グラフ etc. 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 27 / 57
  • 98. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる C の単項&演算子に相当 $scaler_ref = $scalar; # スカラー 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 28 / 57
  • 99. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる C の単項&演算子に相当 $scaler_ref = $scalar; # スカラー $array_ref = @array; # 配列 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 28 / 57
  • 100. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる C の単項&演算子に相当 $scaler_ref = $scalar; # スカラー $array_ref = @array; # 配列 $hash_ref = %hash; # ハッシュ 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 28 / 57
  • 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. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる 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. 変数へのリファレンスを得る 変数の前に逆スラッシュをつけると、リファレン スが得られる 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. デリファレンス リファレンスをたどって、指しているデータにア クセスすることをデリファレンス(dereference) という 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 29 / 57
  • 105. デリファレンス リファレンスをたどって、指しているデータにア クセスすることをデリファレンス(dereference) という Perl では、変数の種別を表すプレフィクス文字$、 @、%、&などを使う これらの文字をシジル (sigil) という C では単項の*によってデリファレンスを行う 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 29 / 57
  • 106. スカラーのデリファレンス デリファレンスした結果はその型の変数として扱 える 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 30 / 57
  • 107. スカラーのデリファレンス デリファレンスした結果はその型の変数として扱 える スカラーへのリファレンスを取得 $sref = $x; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 30 / 57
  • 108. スカラーのデリファレンス デリファレンスした結果はその型の変数として扱 える スカラーへのリファレンスを取得 $sref = $x; スカラー値にアクセスする $a = $$ref; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 30 / 57
  • 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. 配列のデリファレンス 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 31 / 57
  • 111. 配列のデリファレンス 配列へのリファレンスを取得する $array_ref = @array; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 31 / 57
  • 112. 配列のデリファレンス 配列へのリファレンスを取得する $array_ref = @array; 配列全体にアクセス @s = @$array_ref; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 31 / 57
  • 113. 配列のデリファレンス 配列へのリファレンスを取得する $array_ref = @array; 配列全体にアクセス @s = @$array_ref; 配列の要素にアクセス $$array_ref[10] = 10; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 31 / 57
  • 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. 配列のデリファレンスの例 関数 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. ハッシュのデリファレンス 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 33 / 57
  • 117. ハッシュのデリファレンス ハッシュへのリファレンスを取得する $href = %h; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 33 / 57
  • 118. ハッシュのデリファレンス ハッシュへのリファレンスを取得する $href = %h; ハッシュの要素にアクセス $x = $$href{’a’}; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 33 / 57
  • 119. ハッシュのデリファレンス ハッシュへのリファレンスを取得する $href = %h; ハッシュの要素にアクセス $x = $$href{’a’}; keys 関数で、ハッシュのすべてのキーを取り出す foreach (keys %$href) { 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 33 / 57
  • 120. サブルーチンのデリファレンス コードレフ (coderef) とも呼ばれる 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 34 / 57
  • 121. サブルーチンのデリファレンス コードレフ (coderef) とも呼ばれる サブルーチンへのリファレンスを取得する $fref = &func; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 34 / 57
  • 122. サブルーチンのデリファレンス コードレフ (coderef) とも呼ばれる サブルーチンへのリファレンスを取得する $fref = &func; サブルーチンを呼び出す &$fref($param); 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 34 / 57
  • 123. デリファレンスの失敗 リファレンスの本来の型以外にデリファレンスし ようとするとエラーになる $aref = @array; $$aref = 10; Not a SCALAR reference at - line 7. 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 35 / 57
  • 124. ref 関数 引数がリファレンスなら真、そうでなければ偽を 返す 真の値は、リファレンスが指すものの種類を示す 文字列 リファレンス REF スカラー SCALAR 配列 ARRAY ハッシュ HASH サブルーチン CODE 型グロブ GLOB オブジェクト 所属するクラス名 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 36 / 57
  • 125. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  • 126. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される 例えば print 文の引数として使った場合 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  • 127. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される 例えば print 文の引数として使った場合 具体的には「型名+ 16 進表記のアドレス」となる 例:  CODE(0xbb5b48), HASH(0xbb59f8) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  • 128. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される 例えば print 文の引数として使った場合 具体的には「型名+ 16 進表記のアドレス」となる 例:  CODE(0xbb5b48), HASH(0xbb59f8) eq 演算子を使って、リファレンスの等価性(=同 じものを指す)をチェ ックできる 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  • 129. リファレンスから文字列への変換 リファレンスは必要に応じて文字列に変換される 例えば print 文の引数として使った場合 具体的には「型名+ 16 進表記のアドレス」となる 例:  CODE(0xbb5b48), HASH(0xbb59f8) eq 演算子を使って、リファレンスの等価性(=同 じものを指す)をチェ ックできる 文字列からリファレンスへの逆変換は不可 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 37 / 57
  • 130. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  • 131. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける ブロックは正しいリファレンス値を返さなければ ならない 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  • 132. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける ブロックは正しいリファレンス値を返さなければ ならない スカラーのデリファレンス ${$sref} 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  • 133. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける ブロックは正しいリファレンス値を返さなければ ならない スカラーのデリファレンス ${$sref} 関数を呼び出すこともできる @{&get_array_ref()} 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  • 134. ブロックを使ったデリファレンス 変数名やサブルーチン名のうち、英数字の識別子 の変わりにブロックを置ける ブロックは正しいリファレンス値を返さなければ ならない スカラーのデリファレンス ${$sref} 関数を呼び出すこともできる @{&get_array_ref()} ${$a[2]}と$$a[2] の違いに注意 $$a[2] は${$a}[2] と解釈される 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 38 / 57
  • 135. ${$a[2]} と$$a[2] の違い 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 39 / 57
  • 136. -> によるデリファレンス $a->[3] は$$a[3] を表す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 40 / 57
  • 137. -> によるデリファレンス $a->[3] は$$a[3] を表す $h->{key}は$$h{key}を表す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 40 / 57
  • 138. -> によるデリファレンス $a->[3] は$$a[3] を表す $h->{key}は$$h{key}を表す $f->($param) は&$f($param) を表す 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 40 / 57
  • 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. -> によるデリファレンス $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. 多次元配列のエミュレーション $a[3][2][5] のように書けば、あたかも多次元配 列のように使える 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 41 / 57
  • 142. 多次元配列のエミュレーション $a[3][2][5] のように書けば、あたかも多次元配 列のように使える これは実際は$a[3]->[2]->[5] である 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 41 / 57
  • 143. 多次元配列のエミュレーション $a[3][2][5] のように書けば、あたかも多次元配 列のように使える これは実際は$a[3]->[2]->[5] である $a->[3][2][5] との違いに注意 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 41 / 57
  • 144. $a[2][1] と$a->[2][1] の違い 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 42 / 57
  • 145. 無名配列、無名ハッシュの自動生成 Perl では、配列の大きさを宣言する必要はない 要素に値を代入すると、自動的に配列の領域が確保さ れる 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 43 / 57
  • 146. 無名配列、無名ハッシュの自動生成 Perl では、配列の大きさを宣言する必要はない 要素に値を代入すると、自動的に配列の領域が確保さ れる $a[2][3] のような多次元配列風記法でも同様に、 自動的に無名配列、無名ハッシュが生成される 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 43 / 57
  • 147. 無名配列、無名ハッシュの自動生成 Perl では、配列の大きさを宣言する必要はない 要素に値を代入すると、自動的に配列の領域が確保さ れる $a[2][3] のような多次元配列風記法でも同様に、 自動的に無名配列、無名ハッシュが生成される $a[2][1] = 100 を実行すると、下のような配列の 実体が確保される 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 43 / 57
  • 148. 無名配列、無名ハッシュ 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 44 / 57
  • 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. 配列リファレンスを取得するには 配列リファレンスを受け取る関数 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. 無名配列 Perl は、無名配列 (anonymous array) がサポート している ブラケット [] で要素を囲んで指定する 無名の配列が生成されて、それへのリファレンスが返 される 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 46 / 57
  • 152. 無名配列 Perl は、無名配列 (anonymous array) がサポート している ブラケット [] で要素を囲んで指定する 無名の配列が生成されて、それへのリファレンスが返 される 例) 5 要素の名前のない配列へのリファレンスを$aref に 代入 $aref = [1, 2, 3, 4, 5] 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 46 / 57
  • 153. 無名配列 Perl は、無名配列 (anonymous array) がサポート している ブラケット [] で要素を囲んで指定する 無名の配列が生成されて、それへのリファレンスが返 される 例) 5 要素の名前のない配列へのリファレンスを$aref に 代入 $aref = [1, 2, 3, 4, 5] 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 46 / 57
  • 154. 無名配列 関数 compute_sum を呼び出す print "Total: ", compute_sum([1, 3, 5, 7, 9]), "n"; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 47 / 57
  • 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. 無名ハッシュ ハッシュに関しては、無名ハッシュ(anonymous hash)がある ブレース{}で要素を囲んで指定する 要素は「キー、値」のペアで指定する 無名のハッシュが生成されて、それへのリファレンス が返される 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 48 / 57
  • 157. 無名ハッシュ ハッシュに関しては、無名ハッシュ(anonymous hash)がある ブレース{}で要素を囲んで指定する 要素は「キー、値」のペアで指定する 無名のハッシュが生成されて、それへのリファレンス が返される 例) キーと値のペアを 3 個持った名前のないハッ シュへのリファレンス $href = {one => 1, two => 2, three => 3}; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 48 / 57
  • 158. ハッシュと=> =>は太い矢印 (thick arrow) と呼ばれる (「初めての Perl」p@@@@) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 49 / 57
  • 159. ハッシュと=> =>は太い矢印 (thick arrow) と呼ばれる (「初めての Perl」p@@@@) 基本的には、カンマと同じ意味 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 49 / 57
  • 160. ハッシュと=> =>は太い矢印 (thick arrow) と呼ばれる (「初めての Perl」p@@@@) 基本的には、カンマと同じ意味 =>の左側に英数字と下線のみの文字列 (先頭は数字以 外) を置く場合、クォートを省略可— 前ページの例 $href = {one => 1, two => 2, three => 3}; 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 49 / 57
  • 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. ハッシュと=> =>は太い矢印 (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. ハッシュと=> =>は太い矢印 (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. 無名配列と無名ハッシュを組み合わせる 自由に組み合わせることができる。 (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. Data::Dumper モジュール リファレンスで複雑なデータ構造を作れるのはい いけど、表示するにはどうするの? 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 51 / 57
  • 166. Data::Dumper モジュール リファレンスで複雑なデータ構造を作れるのはい いけど、表示するにはどうするの? 単にプリントすると HASH(0x116360) 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 51 / 57
  • 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. 無名サブルーチン (コードレフ)、ク ロージャ 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 52 / 57
  • 169. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  • 170. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている sub { ..... }と書く 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  • 171. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている sub { ..... }と書く 無名のサブルーチンが生成されて、それへのリファレ ンスが返される 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  • 172. 無名サブルーチン Perl は、無名サブルーチン(anonymous subroutine)をサポートしている sub { ..... }と書く 無名のサブルーチンが生成されて、それへのリファレ ンスが返される 無名サブルーチンのリファレンスを fref に代入 $fref = sub { print "Hello, $_[0]n"; } 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 53 / 57
  • 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. 無名サブルーチン 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. クロージャ クロージャ(closure) とは? 無名サブルーチンを生成する際に、その時点で見える レキシカル変数 (my 変数) の実体も閉じ込められ る。これをクロージャと言う。 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 54 / 57
  • 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"; # 11 print $add20->(10), "n"; # 30 print $add1->(30), "n"; # 31 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 55 / 57
  • 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"; # 1 print $bar->(), "n"; # 101 print $bar->(), "n"; # 102 print $foo->(), "n"; # 2 print $bar->(), "n"; # 103 print $foo->(), "n"; # 3 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 56 / 57
  • 178. ご静聴ありがとうございました 近藤 嘉雪 (@yoshiyuki kondo) コンテキストとリファレンスを我が物に! YAPC::Asia 2012 (2012/9/29) 57 / 57