Perl: デリファレンス

| | トラックバック(1)

Perlのリファレンス周辺について、すこし調べた。
Perlのラクダ本の8章、9章。
日本語なのに外国語に見える部分がまだある。


リファレンスに対して、デリファレンスという言葉がある。

全てに優先する基本原則:「Perlは暗黙のうちにリファレンスしたりデリファレンスすることはない」

  • $value_ref = ¥$value

    これがリファレンス

  • $$value_ref

    これがデリファレンス

無名なんとか

@array = [ 'Shibuya', 'Akihabara', 'Odaiba' ];
$array_ref = ¥@array;

これが普通の配列とそのリファレンス。
無名配列はこれをいっぺんにやってしまう。

$array_ref = [ 'Shibuya', 'Akihabara', 'Odaiba', ]

無名配列には配列の名前はないけどリファレンス(番地)だけある。

リファレンスには二種類ある

  • シンボリックリファレンス
  • ハードリファレンス

ただ、リファレンスと言った場合、ハードリファレンスの方。

ハードリファレンスは、
リファレンスとして変数の番地を格納しており、
番地をもとにリファレント(referent: 参照されるもの)を探す。
番地がわかればそこに直接アクセスすることで、
きちんと変数の値を取得する事ができるので、
確固としたもの、という意味でハードの名を冠しているのである。

一方で、シンボリックリファレンスは、
リファレンスとして格納しているのは変数の名前である。
なので番地がわからない。
そこで、一旦シンボルテーブルの中をさがして
目的の変数を探し出さなければいけない。


デリファレンスするひとつの方法として:矢印演算子

$  $arrayref  [2] = "Dorian";
${ $arrayref }[2] = "Dorian";
   $arrayref->[2] = "Dorian";

この三つは等価。
$array[3]と$array->[3]は同じではない事に注意。
矢印演算子は左から右へと結合するので、矢印の左側に
別のデリファレンスを置く事も出来る:

print $array[3]->{"English"}->[0];


ハッシュに関して。

%hash = {
    red => 0xff0000,
    green => 0x00ff00,
    blue => 0x0000ff,
};

ハッシュを書く時にこう書くことは多いと思う。
この時、「=>」という演算子にはコードがより見やすくなる、
という利点だけではなくて、
左側の裸のワード(ベアワード)をクォートするという役割が
あるらしい。


クォートに関して。

q(My name is John)
qq(My name is John)

'My name is John'
"My name is John"

となる。(リテラル文字列)

これに対し、

qw(My name is John)

( 'My', 'name', 'is', 'John' )

となる。(ワードリスト)

文字列をまるごとひとかたまりに扱うのと、
文字列をスペースで区切られた配列として扱うのの違い。


localとourとmy

はっきりいってlocalとourとmyを適切に使う自信はないし、
myはともかくlocalとourの違いや役割がいまいちわかっていない。

ラクダ本によいヒントが書かれていた。

大幅に単純化して言うと、
ourは名前をスコープ内に限定し、
localは値をスコープ内に限定し、
myは名前と値の両方をスコープ内に限定する。

トラックバック(1)

このブログ記事を参照しているブログ一覧: Perl: デリファレンス

このブログ記事に対するトラックバックURL: https://nozawashinichi.sakura.ne.jp/MT-4.25/mt-tb.cgi/164

少し前にPerlのリファレンスとデリファレンスについて書いた。 Perl: デリ... 続きを読む

comments powered by Disqus

このブログ記事について

このページは、Shinichi Nozawaが2008年8月21日 15:37に書いたブログ記事です。

ひとつ前のブログ記事は「変形コールバック(日本語)」です。

次のブログ記事は「MT:管理画面を修正する」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。