Perl勉強会で話した
- 3/8 18:40から約2時間、自分含め7人くらいで、Perlについて語り合った。いいね!
- 前回と違い、何も準備しなかったのがよかった
- 最初に内容を固定してしまうと、どうしてもそれに沿った内容を意識してしまって、柔軟性がなくなるからかな
- 参加者同士の質疑応答、意見交換、他言語との比較などがとても多くてすごく面白かった
- 「OOPについて」みたいなタイトルにしていたけど、実際には半分以上文法の話をしてたと思う
- 前回はPerlのインストールからやったから面白くなかったんだな
文法的なところまとめ
配列とハッシュの代入方法は同じ
- まるかっこで入れる。
- 配列は@
- ハッシュは%
- =>(ファットカンマと呼ばれる)はカンマとほぼ同義
- 唯一の違いは、=>の左側を文字列だと文法レベルで解釈してくれるので、クオートで囲わなくても文字列と認識してくれること
- ハッシュの代入時に使用するのが一般的。見た目にもキーと値がわかりやすい
- 単純に、入れる順番の奇数がキーになって、偶数が値になるだけである
# 一般的な書き方 my @array = (10, 20, 30, 40); my %hash = (one => 1, ten => 10, twenty => 20); # => はカンマと同じなので my @array2 = (10 => 20 => 30 => 40); # という書き方もできる(普通はしない) # ハッシュの代入にすべてカンマも当然できる my %hash2 = ("one", 1, "ten", 10, "twenty", 20); # =>による文字列効果の恩恵が受けられなくなるので # 自力でクオートで囲う必要がある
配列とハッシュの取り出し方
- 配列は@、ハッシュは%と覚えたのに、なぜ取り出すときには$になるのか?
- 表現する値によって、変数のシジル(頭の記号)は変わるから
- なので正確には「配列が入っている変数そのものを表すときに、@」「ハッシュが入っている変数そのものを表すときに、%」
- Perlでは配列の要素やハッシュの値が、配列やハッシュにはなりえない。ゆえに、要素を単独で表現するときには、100%、$をつけることになる
- 配列では角かっこ[]、ハッシュでは山かっこ{}を添字・キーの前後に置く
my @array = (10, 20, 30, 40); print $array[0]."\n"; #=> 10 print $array[1]."\n"; #=> 20 print $array[2]."\n"; #=> 30 print $array[3]."\n"; #=> 40 my %hash = (one => 1, ten => 10, twenty => 20); print $hash{one}."\n"; #=> 1 print $hash{ten}."\n"; #=> 10 print $hash{twenty}."\n"; #=> 20
リファレンスから元の値を取り出す(デリファレンスと呼ばれる)
- 配列なら角かっこ[]、ハッシュでは山かっこ{}を矢印->で呼ぶ
my @array = (10, 20, 30, 40); my $ref = \@array; print $ref->[0]."\n"; #=> 10 print $ref->[1]."\n"; #=> 20 print $ref->[2]."\n"; #=> 30 print $ref->[3]."\n"; #=> 40
my %hash = (one => 1, ten => 10, twenty => 20); my $ref = \%hash; print $ref->{one}."\n"; #=> 1 print $ref->{ten}."\n"; #=> 10 print $ref->{twenty}."\n"; #=> 20
- 矢印記法は、スマートな書き方であり、推奨されるべきもの
- しかし、スマートでない正確な書き方もある
my @array = (10, 20, 30, 40); my $ref = \@array; print ${$ref}[0]."\n"; #=> 10
$ref->[0] と ${$ref}[0] は等価である
断然前者の方が見やすい。
…落とし穴としては、
$ref->[0]->[0]->[0]->[0] と $ref->[0][0][0][0] は等価である
みたいな省略もあるから注意が必要だ! 気をつけよう!
- 上記のスマートでない書き方を思い出すと、スカラ変数のデリファレンスもできることに気がつくはずだ
- なのでスカラ変数のリファレンスももちろんblessすることができるぞ!
my $scalar = "hoge"; my $ref = \$scalar; print ${$ref}."\n"; #=> hoge