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

8,083 views
8,139 views

Published on

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

1 Comment
9 Likes
Statistics
Notes
No Downloads
Views
Total views
8,083
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
39
Comments
1
Likes
9
Embeds 0
No embeds

No notes for slide

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

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

×