Perl日記

PerlとかRubyとかPHPとかPythonとか

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