Your SlideShare is downloading. ×
変数、リファレンス
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

変数、リファレンス

3,225
views

Published on

Hokkaido.pm #4

Hokkaido.pm #4

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,225
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 変数、リファレンス February 19, 2011 Hokkaido.pm #4 Kenichi Ishigaki (charsbar)
  • 2. 始める前に…
  • 3. Perl の変数なんて 別にむずかしくないよね という方?
  • 4. 『言語設計者たちが考えること』
  • 5. Larry がこんなことを 言っていました
  • 6. 「自然言語の原理を コンピュータ言語へと 組み込む最善の 方法を探求」
  • 7. Perl はもともと C 、 sed 、 awk 、 sh の よいとこどりをした言語
  • 8. 英語っぽさを 感じることもあります
  • 9. たとえば 英語の名詞
  • 10. 無冠詞 : pen 単数 : a pen 複数 : pens
  • 11. 無冠詞 (pen)   「~というもの」
  • 12. そのままでは 数えられないもの   # または数えないもの
  • 13. 辞書の見出し語   固有名詞 抽象名詞
  • 14. Perl の場合
  • 15. foo   裸のワード # 英数字と下線だけからなる単語
  • 16. 昔はよくこんな使い方を していたものです   open FOO, 'bar';
  • 17. 定数を定義するときにも よく使われています   use constant PI => 3.14; print PI * 2; # 6.28
  • 18. 具体的なものの 代入は不可   foo = 'bar'; # エラー
  • 19. 具体的なものを 扱うにはどうするか
  • 20. そのものが 単数か複数かで 変わります
  • 21. 単数の場合
  • 22. 英語では冠詞を つけるのでした   pen -> a pen
  • 23. Perl の場合は 「 $ 」という記号を つけます   foo -> $foo
  • 24. この記号は あくまでも 冠詞扱い   # 変数名の一部ではありません
  • 25. だからこんな 書き方も可能です   $ foo = 1; print $ foo; # 1
  • 26. 真似しないで くださいね
  • 27. どうして $ なのか
  • 28. スカラー (scalar) の 頭文字   # 高校の物理で習いましたよね # 「矢印」がつかない値
  • 29. 複数の場合
  • 30. 英語では語形が 変わったり   a pen -> pens a man -> men
  • 31. 数をあらわす 形容詞句がついたり   two pens a lot of men
  • 32. 単複同型というのも ありました   単数 : a sheep 複数 : sheep
  • 33. Perl の場合は @ という 記号をつけます   @foo = (1, 2, 3);
  • 34. 配列 (array) の 頭文字から perldata では「 these とか those 」
  • 35. 細かくいうと 配列とリストは別物
  • 36. $foo と @foo の関係
  • 37. 名前は同じです
  • 38. いっぺんに扱う 手段もあります
  • 39. 中身は別物です   a pen ≠ pens
  • 40. 「複数」の性質
  • 41. 単数+単数=複数   @pens = ($red_pen, $blue_pen);
  • 42. 複数+複数=複数   @pens = (@red_pens, @blue_pens);
  • 43. 要素の個数は あまり気にしません   # 複数は複数です
  • 44. 配列の要素を 扱うときは for などで   foreach (@pens){ print $_ }   # $_ は英語の it と同じ単数の代名詞 # 中身については空気を読んで
  • 45. コアレベルでは 省略できることも多い   foreach (@pens) { print } print for @pens;
  • 46. 他動詞だから目的語をとるはず、というのが 暗黙の了解
  • 47. 誤解を避けたければ 明示して   for $pen (@pens) { print $pen }
  • 48. 処理の順番は?
  • 49. リストの場合は左から右 ということになっています   print for (1, 2, 3);
  • 50. でも、左ってどこ?   print for @pens;
  • 51. どこかにはあるはずです が、隠れています
  • 52. という記号をつけると 起点の位置を 取得できます   @pens;
  • 53. 具体的にどこにあるかは 気にしなくていいです
  • 54. @ という具体的な 文脈をあらわす記号を 打ち消しているイメージ
  • 55. 起点がわかったら 向きと長さを指定すれば 個々の要素に アクセスできます   (@pens)->[0];
  • 56. この起点のことを Perl の文脈では リファレンスと呼びます
  • 57. 「よく使われる表現は、 あまり使われない表現 よりも短くあるべき」 ( 『言語設計者たちが考えること』 )
  • 58. ふだんはもう少し 楽をしたいですよね
  • 59. ひと頃は こんな風にも 書けました   @pens->[0];
  • 60. Perl 5.8 で 廃止されました # 文脈がわかりづらくなるから # 複数のものから矢印 ?!
  • 61. 起点はひとつしか ありません
  • 62. ということは 単数扱いに なるはずです
  • 63. Perl 5 では スカラーとしても 扱えるようになりました   $pens_ref = @pens; $pens_ref->[0];
  • 64. 矢印が生えるのに !?
  • 65. 普通のスカラーとは 違います
  • 66. 中身を覗いて みましょう   perl -e "print @array" # ARRAY(0x33e288)
  • 67. ぐちゃぐちゃに ならないよう 内部的には別扱い されています
  • 68. Devel::Peek を使うと 詳しく調べられます   perl -MDevel::Peek -e "@a = (1, 2); print Dump(@a)" # Perl 5.6 以降はコアに入っています
  • 69. むずかしいことは 忘れてください
  • 70. 矢印が生えていれば (たいていは) リファレンスです   $pens_ref->[0];
  • 71. ref でも確認できます   ref $scalar_or_ref ? 'ref' : 'scalar';
  • 72. 誤解されそうな文脈では 名前を変えておきましょう   ○ $pens_ref = @pens; × $pens = @pens;
  • 73. これでだいぶきれいに 書けるようになりました
  • 74. でも、もう少し 楽をしたいです
  • 75. できるように なっています   @pens; # $pens_ref = @pens; $pens[0]; # $pens_ref->[0];
  • 76. $pens と $pens[0] と $pens->[0] は それぞれ文脈が 異なります
  • 77. $pens は純然たるスカラー(たぶん) $pens->[0] の $pens はリファレンス $pens[0] は @pens の一要素
  • 78. ベクトルの指す値は 矢印ひとつにつき ひとつのみです   $array_ref->[0] # 返り値はひとつのはずです
  • 79. 配列にはスカラー (として扱えるもの) しか入れられない という制約が   $array_ref->[0] にわざわざ $ をつける必要はありません
  • 80. 配列にはスカラー (として扱えるもの) しか入れられない という制約が   $array_ref->[0] にわざわざ $ をつける必要はありません
  • 81. 配列から複数の値を 取り出したい場合も あります
  • 82. ひとつひとつ列挙 してもかまいません   $first_pen = $pens[0]; $second_pen = $pens[1];   # 冗長ですよね
  • 83. 一行にまとめてみました   ($first_pen, $second_pen) = ($pens[0], $pens[1]);
  • 84. もう少し短くできます   ($first_pen, $second_pen) = pens; # 3 つめ以降の pen は無視されます
  • 85. こんな書き方も できるのですが…   @two_pens = @pens[0, 1]; # @pens[0..1]
  • 86. 必要がなければ 避けた方が無難
  • 87. 意図とは異なる (かもしれない) 結果になるもの
  • 88. 1 本なのに 複数扱い !? × @pens[0];
  • 89. ベクトルの行き先はひとつのみです × $pens_ref->[0, 1]
  • 90. 先にデリファレンスされて しまいますので… × @$pens_ref->[0, 1]
  • 91. 配列にしてからなら OK ○ @$pens_ref[0, 1]
  • 92. 便利に使える 場合もあります
  • 93. 複数の配列を含む配列の場合
  • 94. 赤だけ、青だけの 配列を区別できません   @pens = (@red_pens, @blue_pens); × (@red_pens, @blue_pens) = @pens;
  • 95. 配列に入れられるのは スカラー扱いできる値のみ   配列をそのまま配列に 入れることはできません
  • 96. 区別するには リファレンスを 使います   @pens = (@red_pens, @blue_pens);
  • 97. 矢印をたどっていけば 目的地につきます   ($red_pens_ref, $blue_pens_ref) = @pens; $red_pen = $red_pens_ref->[0]; $blue_pen = $pens[1]->[0]; # = $pens[1][0];
  • 98. 配列のなかの リファレンスから 生える矢印はふつう省略できます
  • 99. 自動的にふられる 番号ではわかりづらい場合もあります   @pens = (@red_pens, @blue_pens);
  • 100. 青ペンの 1 本目 には見えません ! $pens[1][0];
  • 101. 要素が増減したら いちいち順番を直す必要があります
  • 102. もっと明確に書きたいときは ハッシュという特殊な配列を使います   # 昔は連想配列と言っていました
  • 103. ハッシュの場合は 届け先を明記します %pens = ( red_pens => @red_pens, blue_pens => @blue_pens, );
  • 104. % -> c/o -> care of 「~様方」
  • 105. 使い方は ふつうの配列と よく似ています
  • 106. %pens = (...); $pens{red_pens}; $ pens {blue_pens};
  • 107. $pens_ref = %pens; $pens_ref->{red_pens}; $ pens_ref -> {blue_pens};
  • 108. それぞれの要素に アクセスしたいとき   for (keys %hash){ print $hash{$_} } for (values %hash){ print $_ } while(($key, $value) = each %hash) { ... } # 並び順は不定です
  • 109. %pens = ( red_pens => @red_pens, blue_pens => @blue_pens, ); ハッシュのなかの 配列に名前は必要?
  • 110. %pens = ( red_pens => ['mine', 'yours'], # @red_pens blue_pens => ['his', 'hers'], # @blue_pens ); $red_pens_ref = $pens{red_pens}; 必要なければ 省略してしまいましょう
  • 111. [...] は無名配列の リファレンスです   (...) だと別の意味になるので要注意
  • 112. ふつうの配列に したいときは 「冠詞」をつけて   @pens = @{['red_pen', 'blue_pen']};
  • 113. もちろん 無名ハッシュへの リファレンスも つくれます   $pens_ref = { red_pens => 2, blue_pens => 3 }; %pens = %{{red_pen => 1, blue_pen => 2}};
  • 114. どうして @{...} に なるのでしょう?
  • 115. Perl にはシンボル テーブルと呼ばれる 特殊なハッシュが 用意されています
  • 116. 中身を覗いて みましょう perl -MDevel::Symdump –e "print Devel::Symdump->rnew->as_string"
  • 117. もう少し詳しく 見たいときはこちら   perl -MData::Dump=dump -e "print dump(%::)"
  • 118. グローバル変数 パッケージ 関数/メソッド
  • 119. 多くのものがこの 無名ハッシュのなかに 登録されています
  • 120. $bl{HASH}{"Data::"}{HASH}{"Dump::"}{HASH}{"seen"} = { "16258dc" => ["k", []], "16258e8" => ["bl", ["*{HASH}"]], "1625900" => ["bl", []], "1625918" => ["al", []], } 変数名やリファレンスの ID は ハッシュのキーになっています
  • 121. これまで見た変数は このようにも 書き換えられます
  • 122. print ${foo}; # $foo print @{"bar"}; # @bar print ${ 'b' . 'az' }{foo}; # $baz{foo}
  • 123. 文字列のなかに 変数を埋め込むときに便利なことも   $foo = "chars"; print "${foo}bar";
  • 124. デリファレンスの 優先順位を明示したいときにも有効
  • 125. 全部ひっくるめた 型グロブというものも あります   *{"foo"}
  • 126. 昔はファイルハンドルの 受け渡しなどに 使っていました
  • 127. いまはシンボルテーブルを いじるときにしか使いません
  • 128. 型グロブは 「無冠詞」の変数も うまくさばいてくれます   open FOO, ‘file’; do_something(*FOO); # Perl 4 風
  • 129. ゆるい世界では こんな書き方さえ できます
  • 130. @array = (1, 2); print array->[0]; # 警告つき print *array->[0]; # 警告すらでません
  • 131. 今日はあえて ゆるい世界の話に 終始しました   今日取り上げた例のいくつかは、 use strict; するとエラーになります
  • 132. 後付けの説明なので 実際の歴史や実装とも ずれがあります
  • 133. Perl 自体、当初の デザインからは さまざまな点で 変わってきています
  • 134. そのすべてを覚えて いられる人は おそらくいません
  • 135. 詳しいことを 知りたい人は perldoc.jp へ
  • 136. perldata, perldsc, perlref, perlreftut, perlobj, perllol, perlsub, perlfaq4, perlfaq7
  • 137. ご静聴ありがとう ございました