SlideShare a Scribd company logo
1 of 178
Download to read offline
.
     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

What's hot

事業のグロースを支えるDataOpsの現場 #DataOps #DevSumi #デブサミ
事業のグロースを支えるDataOpsの現場 #DataOps #DevSumi #デブサミ事業のグロースを支えるDataOpsの現場 #DataOps #DevSumi #デブサミ
事業のグロースを支えるDataOpsの現場 #DataOps #DevSumi #デブサミ@yuzutas0 Yokoyama
 
std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所Hiroaki Goto
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
短期間で新技術を学ぶ技術
短期間で新技術を学ぶ技術短期間で新技術を学ぶ技術
短期間で新技術を学ぶ技術Takafumi ONAKA
 
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...NTT DATA Technology & Innovation
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO についてTomoya Kawanishi
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
Pythonでパケット解析
Pythonでパケット解析Pythonでパケット解析
Pythonでパケット解析euphoricwavism
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Hiro H.
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話Kentaro Yoshida
 
RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集akipii Oga
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームKouhei Sutou
 
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)NTT DATA Technology & Innovation
 
機械学習の技術的負債
機械学習の技術的負債機械学習の技術的負債
機械学習の技術的負債西岡 賢一郎
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2Yahoo!デベロッパーネットワーク
 

What's hot (20)

事業のグロースを支えるDataOpsの現場 #DataOps #DevSumi #デブサミ
事業のグロースを支えるDataOpsの現場 #DataOps #DevSumi #デブサミ事業のグロースを支えるDataOpsの現場 #DataOps #DevSumi #デブサミ
事業のグロースを支えるDataOpsの現場 #DataOps #DevSumi #デブサミ
 
std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
短期間で新技術を学ぶ技術
短期間で新技術を学ぶ技術短期間で新技術を学ぶ技術
短期間で新技術を学ぶ技術
 
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
 
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッションオンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッション
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
Pythonでパケット解析
Pythonでパケット解析Pythonでパケット解析
Pythonでパケット解析
 
Apache Sparkの紹介
Apache Sparkの紹介Apache Sparkの紹介
Apache Sparkの紹介
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話
 
RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
 
機械学習の技術的負債
機械学習の技術的負債機械学習の技術的負債
機械学習の技術的負債
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
 

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

鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門Hiroyoshi Komatsu
 
【簡単テキストマイニング】歌詞から作品世界の魅力を探る
【簡単テキストマイニング】歌詞から作品世界の魅力を探る【簡単テキストマイニング】歌詞から作品世界の魅力を探る
【簡単テキストマイニング】歌詞から作品世界の魅力を探るShow T
 
単語・句の分散表現の学習
単語・句の分散表現の学習単語・句の分散表現の学習
単語・句の分散表現の学習Naoaki Okazaki
 
文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)
文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)
文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)Shirou Maruyama
 
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行monglee
 
ROS 2 Client Library for E^2
ROS 2 Client Library for E^2ROS 2 Client Library for E^2
ROS 2 Client Library for E^2Hideki Takase
 
高位合成友の会第四回(2016/11/22)スライド
高位合成友の会第四回(2016/11/22)スライド高位合成友の会第四回(2016/11/22)スライド
高位合成友の会第四回(2016/11/22)スライド一路 川染
 
黒い目の大きな女の子:構文から意味へ
黒い目の大きな女の子:構文から意味へ黒い目の大きな女の子:構文から意味へ
黒い目の大きな女の子:構文から意味へHiroshi Nakagawa
 

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

鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門鬱くしい日本語のための形態素解析入門
鬱くしい日本語のための形態素解析入門
 
【簡単テキストマイニング】歌詞から作品世界の魅力を探る
【簡単テキストマイニング】歌詞から作品世界の魅力を探る【簡単テキストマイニング】歌詞から作品世界の魅力を探る
【簡単テキストマイニング】歌詞から作品世界の魅力を探る
 
単語・句の分散表現の学習
単語・句の分散表現の学習単語・句の分散表現の学習
単語・句の分散表現の学習
 
文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)
文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)
文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)
 
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
 
ROS 2 Client Library for E^2
ROS 2 Client Library for E^2ROS 2 Client Library for E^2
ROS 2 Client Library for E^2
 
高位合成友の会第四回(2016/11/22)スライド
高位合成友の会第四回(2016/11/22)スライド高位合成友の会第四回(2016/11/22)スライド
高位合成友の会第四回(2016/11/22)スライド
 
黒い目の大きな女の子:構文から意味へ
黒い目の大きな女の子:構文から意味へ黒い目の大きな女の子:構文から意味へ
黒い目の大きな女の子:構文から意味へ
 

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