2013年07月24日の日記、Perl - リファレンスが難しい・・・
もお、Perlのリファレンスがむずかしい!
本当に理解できるようになるかな?
心配だっ(> <)

でも、この「続・初めてのPerl」はリファレンスについてはとてもわかりやすい説明がされてると思う。
「プログラミングPerl」はもっとわかりやすいかな?
深すぎてついていけないかな?;

さて、ぼくのグチを聞いてもらうために、リファレンスについて説明してみる。
説明してるうちに理解が深まるかもだし。

リファレンスはC言語でいうところのポインタです。(Cで言うなって?w)
簡単に説明するためあえて間違った言い方で説明すると、
ポインタはコンピュータ上のとある場所を指します。
それだけです。
よくある説明だと「住所」とか言います。
「なんだ簡単♪」と思うかもですが、簡単なのはここまでで。

住所がわかったところで、そこにあるデータ、ここでは「建物」が問題なのです。
とある住所にいる人に会いに行くとしましょう。
一軒家なら簡単です。
じゃあ、アパートでは?
階段を登ったり、ドアをいくつか通りすぎなければならないかもです。
じゃあ、会社のビルだったら?
小さな会社だったら直に4階にエレベータで上がって、営業部に行って呼んでもらうかもしれません。
じゃあ大きな会社だったら?
複数の会社が入ったビルだったら?
結構大変でしょ?

実は英語の「data」という単語は複数形だったりします。
「datum」という単語が単数形です。まあ、これは余談です。

で、C言語で言うところのポインタが、Perlで言うところのリファレンス(参照)です。
リファレンスを使って、ある人に会いに行くことをデリファレンスといいます。
リファレンスというより、デリファレンスが難しいのです。

さらにやっかいなことは、Perlのそのデータ参照(デリファレンス)のやり方が複数あることです。
Perlの標語的なものがあるのですが、

「やり方はひとつじゃないぜ!」

っていうのは確かに本当です。
(本当の本当はデータアクセスの方法のことじゃないんですけど。。。)
でも、そこは初心者には高い壁にはなっているでしょうね。

最後にデリファレンスの例です。

# 例とする為、ちょっと無意味なハッシュデータを2つ作る
my %gilligan_info = (
name => 'Gilligan',
);
my %skipper_info = (
name => 'Skipper',
);

# ハッシュのリファレンスを配列にセットする
my @crew = ( \%gilligan_info, \%skipper_info );

my $datum;# あえて datum に登場してもらいましたw

# 以下、処理を実行!

$datum = ${$crew[1]}{name};
print "1: $datum\n";

$datum = $crew[1]{name};
print "2: $datum\n";

# crew配列のリファレンスを取得
my $ref = \@crew;

$datum = ${@{$ref}[1]}{name};
print "3: $datum\n";

$datum = ${$ref}[1]{name};
print "4: $datum\n";

$datum = $$ref[1]{name};
print "5: $datum\n";

$datum = $ref->[1]->{name};
print "6: $datum\n";

$datum = ${$ref}[1]->{name};
print "7: $datum\n";

$datum = ${${$ref}[1]}{name}; # 最凶バージョン?
print "8: $datum\n";


なんと、このプログラムの結果表示は!
1: Skipper
2: Skipper
3: Skipper
4: Skipper
5: Skipper
6: Skipper
7: Skipper
8: Skipper


この例だと8通りのデータアクセス方法がありました。
まあ、リファレンスをわざわざ使ったからですが、まだ方法あるのでしょうか?
ちなみにこれを正しく実行するのに結構トライ&エラーしました orz

リファレンスこんな感じです。
でも、なんとかして Perl を身につけたいので頑張ります!
[PR]
by redchant | 2013-07-24 23:00 | 日記
<< 2013年08月02日の日記、... 2013年07月20日の思ひ出... >>