|
リファレンス
データーの居場所を記しています
ややこしいけれど複雑なプログラムを作るには大事です。
しかし、ちょっとしたプログラムを作る程度ならいらないとも言えます。(^-^;
リファレンスとは変数のアドレスを覚えておくスカラー変数です。
|
そもそも変数とは
- $x = 'Perlたんは器用貧乏で不細工だけどマメ。セピア色の髪と瞳。言語能力が高い。';
とかした場合、コンピュータはこの長い文字列をメモリに記録して、アドレスと変数名を
リンクさせています。
リファレンスとは値の書かれたアドレスだけを覚えておく変数です。
これを使うメリットは、長いデーターを渡すよりも処理が早くなったり、複雑なデーター
のかたまりを取り扱うことが可能になります。
デメリットは慣れるまで頭の中がこんがらがるというところです。中級者以上向けです。
リファレンスを代入するには変数の頭に\をつけます。
$x = \$y; #スカラー変数のアドレスを代入
$x = \@y; #配列変数のアドレスを代入
$x = \%y; #ハッシュ変数のアドレスを代入
$x = \'Perlたん'; #値のアドレスを代入、この場合読込専用
|
ここで注目すべきは配列を1つのスカラー変数に代入できるということです。
実を言うとPerlの配列は1次しかあつかえません。
なので、2次元以上の配列を使うにはこのリファレンスを使うことになります。
とか、意味の分からないことを言ってるかもなので、すみません。
$x の中にはアドレスが入っているだけなので、そのままprintしても意味不明の
記号が表示されるだけで、実際の値は分かりません。
これを再び参照するには前に$,@,%などのもとの冠を付けてやります。
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$x = 'Perlたんは器用貧乏で不細工だけどマメ。セピア色の髪と瞳。言語能力が高い。';
$xr = \$x;
print $xr .'<br>';
print $$xr.'<br>';
@y = (1,2,3,4,5);
$yr = \@y;
print "$yr <br>";
print "@$yr <br>";
%z = (A=>"100", B=>"200");
$zr = \%z;
print $zr.'<br>';
print %$zr;
↓
SCALAR(0x275c00)
Perlたんは器用貧乏で不細工だけどマメ。セピア色の髪と瞳。言語能力が高い。
ARRAY(0x275c9c)
1 2 3 4 5
HASH(0x15414b4)
A100B200
|
リファレンスのリファレンスも作れます。
リファレンス自体はアドレスを書いただけのただの文字ですので前には $ を付けます。
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$x = '脚なんて飾りですよ。偉い人にはそれが分からんのです。';
$xr = \$x;
$xrr = \$xr;
print $xr .'<br>';
print $$xr .'<br>';
print $$xrr.'<br>';
print $$$xrr.'<br>';
↓
SCALAR(0x275c00)
脚なんて飾りですよ。偉い人にはそれが分からんのです。
SCALAR(0x275c00)
脚なんて飾りですよ。偉い人にはそれが分からんのです。
|
配列やハッシュをリファレンスにした場合、その中身を見る方法は2種類あります。
1つは先ほど説明したように頭にもとの冠(@,%)をつける方法です。
2つめは -> 使う方法です。
|
具体的には以下のようになります。
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@y = ('ねこみみ','たれみみ','みみカバー');
$x = \@y;
print @$x[0]."<br>"; #1つめの方法
print $x->[1]."<br>"; #2つめの方法
print $x->[2]."<br>"; #どちらを使うかは好みですかね
↓
ねこみみ
たれみみ
みみカバー
|
これを応用して2次配列を作ってみます。
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@x = ('ねこみみ','たれみみ','みみカバー');
@y = ('巨乳','低脂肪乳','つるぺた');
$z[0] = \@x;
$z[1] = \@y;
print "$z[0]:";
print "$z[0]->[0]、";
print "$z[0]->[1]、";
print "$z[0]->[2] <br>";
print "$z[1]:";
print "$z[1][0]、";
print "$z[1][1]、";
print "$z[1][2] <br>";
↓
ARRAY(0x275c0c):ねこみみ、たれみみ、みみカバー
ARRAY(0x275c90):巨乳、低脂肪乳、つるぺた
|
下3行に注目です。
添え字の間にある -> は省略できるのです。
$x->[0]->[0]->{nanika}
↑ ↑ ↑
省略不可 省略可能
|
もうひとつ、これをハッシュを使って表現すると。
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@x = ('ねこみみ','たれみみ','みみカバー');
@y = ('巨乳','低脂肪乳','つるぺた');
$z{mimi} = \@x;
$z{titi} = \@y;
print "$z{mimi}:";
print "$z{mimi}[0]、";
print "$z{mimi}[1]、";
print "$z{mimi}[2] <br>";
print "$z{titi}:";
print "$z{titi}[0]、";
print "$z{titi}[1]、";
print "$z{titi}[2] <br>";
↓
ARRAY(0x275c0c):ねこみみ、たれみみ、みみカバー
ARRAY(0x275c90):巨乳、低脂肪乳、つるぺた
|
このときの %z のイメージ。(%zはハッシュ)
%z = {
'titi'=>( '巨乳', '低脂肪乳', 'つるぺた' )
'mimi'=>( 'ねこみみ', 'たれみみ', 'みみカバー')
}
|
ソースを見たときに属性とその候補に分けられている様子が分かりやすいですね。
このようにあらかじめデーターを整理して取り込めば添え字が複数ある配
列のように使用することができます。
また、かなり自由に取り込むことも出来るので、臨機応変に使い分けることができます。
無名ハッシュやハッシュなど、無節操に取り込んだ例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
@y = ('ねこみみ','たれみみ','みみカバー');
$x->{a} = '耳属性';
$x->{b} = \@y;
print "$x->{a} <br>";
print "$x->{b}[0] <br>";
print "$x->{b}[1] <br>";
print "$x->{b}[2] <br>";
↓
耳属性
ねこみみ
たれみみ
みみカバー
|
このときの $x のイメージ。($xはスカラー変数、配列変数じゃないのに同じことが出来ます)
$x = {
'a' => '耳属性',
'b' => ( 'ねこみみ', 'たれみみ', 'みみカバー' )
};
|
リファレンスの初期化、結合
全体の初期化
undef $x;
任意の要素だけを初期化
delete $x->{b};
delete $x->{b}[1];
リファレンスの結合
my %data_all = (%$data_1 ,%$data_2);
my $data_all = \%data_all;
可視化すると、例えばこんな感じになります。
$data_1 = {
'歴代5位' => 'TRUTH -A GREAT DETECTIVE OF LOVE',
'歴代4位' => 'Give a reason'
};
+
$data_2 = {
'歴代3位' => 'JUST COMMUNICATION',
'歴代2位' => 'RHYTHM EMOTION',
'歴代1位' => 'めざせポケモンマスター'
};
↓
$data_all = {
'歴代5位' => 'TRUTH -A GREAT DETECTIVE OF LOVE',
'歴代4位' => 'Give a reason'
'歴代3位' => 'JUST COMMUNICATION',
'歴代2位' => 'RHYTHM EMOTION',
'歴代1位' => 'めざせポケモンマスター'
};
(ハッシュの性質上順不同になることがあります)
あと、こんなでも可。
push( @$data_1, @$data_2 );
|
リファレンス→配列
$data->{attribute}
↓
$VAR1 = [
'八重歯',
'ダダ甘',
'ニーソックス',
'ツインテール',
];
こういうレファレンスから要素情報をとるとき。
my @attribute = @{$data->{attribute}}; # 配列
my $attribute = $#{$data->{attribute}}; # 添え字の最大値
いじょ、お疲れ様でした。
とても話が膨らんでしまいましたが、リファレンスに関しては他にもサブルーチンのアド
レスを割り当てることもできたりでまだまだ使い道は多いのですが、そのへんのお話はも
っとあとですることにします。(^-^;
あと注意点が1つ。普通の変数と違うのは、リファレンスとは値の格納されているディスク上の座標のようなものを指しているだけなので、例えばリファレンスを使って実際の値を書き換えてしまった場合、同じプログラム内の遠くはなれた別の場所で参照している箇所があれば、うっかりしていると「イミフwww、何もしてねえのに、うはwwww、値が勝手に書き換わってる、ワケ分からんネ、俺涙目wwwww」みたいなことにもなりかねません。でも、そこだけ理解していればわりかし簡単かもです。
とか、言いましたが、ちょっと、わけが分からなかったら、ひとまず忘れてもらっても結構です。
ごめんなさいね。
|
日常会話とで微妙な感じの単語について徒然なるままに書きます。
【任意】自分の都合で好きなように、という意味なのですが「任意の値を代入」とか「任
意の名前をつける」とか言われると戸惑います。
【ローカル】日常では田舎とか地域限定みたいな意味で使われますし、プログラム的にも
根本的には同じような意味で使われます。しかし、大体は手元のパソコンやプログラム内
にあるサブルーチンの中やそこだけで使ってる変数などのことを指すことが多いので、や
っぱりなんか変です。
【動的】CGIを使ってページを表示する時、同じURLでもその時々で内容が変化する
ページのことを「動的なページ」とか「動的に変化するページ」とか言います。
動的に変化って頭痛が痛いみたいですね。
【静的】↑の反対で常に同じ表示をするページなどのことを指します。いずれの場合も「
童的」「性的」ではありませんので気をつけてください。
【流儀】プログラムを書くときの個々人の癖みたいなもの。単純に見た目(詰めて書くと
か何行にも分けて書くとか)である場合や構造的なこと、変数やルーチンの名前のつけ方
までさまざまですぅ。自宅で作るプログラムでは自分の好きにして結構ですが、会社など
では他の人が見ることもあるので長いものに巻かれて下さい。それが社会人の事情。
【サーバー】意味が広すぎて、専用のコンピューターという「物」を指すのか、情報を提
供するという「役割」のことを指すのか、中で動いている「常駐ソフト」のことを指すの
か分からない場合がままあります。案外しゃべってる方も良く分からずに「さぁばぁ」と
言っているのかも知れません。ネットでは鯖と書かれることが多いです。
【アルファベット3文字】いろんな用語をアルファベット3文字にしてしまうこの業界の
悪い癖。けっこうかぶることもあるので、結局「それはこういう意味のXXXですか」み
たいな確認を取る必要があったりで、ちょっと嫌。
|
|