ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-05-10

[][]Perlの変数について考え(妄想し)てみた 13:01 Perlの変数について考え(妄想し)てみた - ishiducaの日記 を含むブックマーク はてなブックマーク - Perlの変数について考え(妄想し)てみた - ishiducaの日記 Perlの変数について考え(妄想し)てみた - ishiducaの日記 のブックマークコメント

いきなりだけど、変数 - モダンなPerl入門 // perl-users.jp では、Perlの変数を

$scalar # スカラー変数
@list   # リスト変数
%hash   # ハッシュ変数
*glob   # グロブ

に分類し、変数の先頭につく「$, @, %, *」を「sigil」という変数の種類を指定するもの、と説明しています。詳しくは、本文を参照してもらうとして、これらの変数を分解すると、

$ と scalar
@ と list
% と hash
* と glob

まあ「変数の型」と「名前(識別子)」ですね。

僕はこれを「変数を入れておく容器」と「その容器に張ってある名札」みたいに考えてみたんですが、どうでしょう? つまり、sigil の方がデータを保持しておく器の本体で、変数名の方が、外からその器を識別するための名札。

データは形がない水のようなものなので、容器に入れて保持(管理)しなくちゃいけない。なので器($, @, %, *)に入れて保持しておく。ただ、このままだと器の種類はわかるけど、何が入っているのか外から見た時に分らなくなるので、名札を付けて管理する。という風に解釈してみたんだけどどうかなぁ?

なんで今更、変数の話なんかしているのかというと、ちょうどリファレンスの学習を始めてひっかかるところがあったから(このリファレンスの学習もモジュールとかオブジェクト指向を学ぶ入り口に学び始めているんですが)。

今は初歩の段階で、各々の変数やらサブルーチン... から参照情報(リファレンス)を得るのに、バックスラッシュ演算子「\」を使って、デリファレンスするのに中括弧「{}」を使ってる。こんな感じで。

my @list = qw( perl ruby c++ python java );
my $reference = \@list;    # $reference に@listの参照先のアドレスを代入
print   ${$reference}[-1]; # $reference を利用して @list のデータを利用
# print $list[-1];         # と同じ結果になる

実行結果

java

これって「{$reference}」が「list」の部分に置き換わってるだけなんじゃないの?中括弧「{}」が、変数に格納されたデータにアクセスするインターフェイスだったら、「list」という識別子と「$reference」(の内部)に格納された位置情報も内部的には同じものなのかと?そうすると、識別子はデータそのものを保持する役目じゃなくて、他のデータ(のある位置情報)と識別するための名札なんじゃないかと妄想する訳です。試しにこんな書き方もやってみた

print ${list}[-1];
$, = ", ";
print @{list};

実行結果

java
perl, ruby, c++, python, java

ここまで読んでくれている人は、なかなか希有な方だと思うんですが、そんな方にこそお願いです。ツッコミよろしくお願いします。


それはさておき、pel-users.jp のPerl入門更新してほしいです。

bayashi_netbayashi_net2009/05/16 11:14良い例ではないと思いますが。
perl -e '$r="abc";print ${hoge()};sub hoge { return "r"; }'

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090510