blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_5 リファレンス

Perl リファレンス 10 デリファレンス, 自動有効化, autovivification (d013)

Perl リファレンス 10 デリファレンス, 自動有効化, autovivification (d013)

目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その d013 回。

Perl で、自動的に配列の要素やハッシュの key/value のリファレンスを生成する「 自動有効化 」 ( autovivification ) を確認する。


変数の宣言とタイプ



通常、何らかのデータを格納する変数は、次のように「 宣言 」( declaration ) をして利用します。


my $scalar;

my @array:

my %hash;



反対にいえば ( use strict (0x35) の下では )、宣言していない変数は使えません。

また、変数には「 スカラ $ 」, 「 配列 @ 」, 「 ハッシュ % 」といったタイプがあり、通常それぞれのタイプに沿ったデータが格納されるように出来ています。

ですから、「 スカラ 」タイプの変数に「 リスト 」タイプの配列データは格納できませんし、「 配列 」タイプの変数に「 ハッシュ 」データは格納できません。


# data3 only store
my $scalar = qw/data0 data1 data3/;

# not hash but as list store
my @array = ( key1 => 'val1', key2 => 'val2' );

# key1 = data0, value1 = data1, key2 = data3, value2 = undef
my %hash = ( qw/data0 data1 data3/ );



しかし、「 デリファレンス 」した変数に関してはやや事情が異なります。


リファレンス / デリファレンス



リファレンスが保持するデータは、目的のデータへの参照情報 ( データが格納されている場所の情報 ) だけなので、参照先のデータのタイプに関わらず、リファレンスのデータは常に単一 ( スカラ ) です。


# SCALAR(0xd8fb48)
my $ref_sclr = \'scalar';

# ARRAY(0xd8fa70)
my $ref_arry = [ qw/data0 data1 data3/ ];

# HASH(0xd72d48)
my $ref_hash = { key1 => 'val1', key2 => 'val2' };



リファレンスのデータを操作するにはデリファレンスを行います。

スカラリファレンスをデリファレンスするには次のようにします。


# スカラとして
${$ref_sclr};

# or
$$ref_sclr;



配列リファレンスを配列全体としてデリファレンスするには次のようにします。


# 配列全体として
@{$ref_arry};

# or
@$ref_arry;



配列リファレンスの要素をデリファレンスするには次のようにします。


# 配列の要素として
${$ref_arry}[0];

# or
$$ref_arry[0];

# or
$ref_arry->[0];



ハッシュリファレンスをハッシュ全体としてデリファレンスするには次のようにします。


# ハッシュ全体として
%{$ref_hash};

# or
%$ref_hash;



ハッシュリファレンスのバリューをデリファレンスするには次のようにします。


# key1 の value をデリファレンス
${$ref_hash}{key1};

# or
$$ref_hash{key1};

# or
$ref_hash->{key1};



これで、一通りのデリファレンスができます ( 他にも CODE や GLOB のデリファレンスがありますが )。

しかし、デリファレンスには別の機能も備わっています。


自動有効化



デリファレンスには、*左辺値で先行して利用することで* 存在しないリファレンスを自動的に有効化することができます。

例えば、次のように配列の要素のデリファレンスを左辺値に記述してデータを代入することができます。


# 単なるスカラ変数
my $ref_arry;

# 左辺値で配列リファレンスとしてデリファレンス
$ref_arry->[0] = 'data1';
$ref_arry->[2] = 'data3';

# data1
print $ref_arry->[0], "\n";
# undef
print $ref_arry->[1], "\n";
# data3
print $ref_arry->[2], "\n";

__END__

# データ構造
$VAR1 = [
'data1',
undef,
'data3'
];
$VAR2 = '
';



ハッシュのデリファレンスも同様です。


# 単なるスカラ変数
my $ref_hash;

# 左辺値でハッシュリファレンスとしてデリファレンス
$ref_hash->{key1} = 'val1';
$ref_hash->{key3} = 'val3';

# val1
print $ref_hash->{key1}, "\n";
# val3
print $ref_hash->{key3}, "\n";

__END__

# データ構造
$VAR1 = {
'key1' => 'val1',
'key3' => 'val3'
};
$VAR2 = '
';



いずれも、もとは存在していなかったリファレンスが生成されていることがわかります。

このデリファレンスの機能は「 自動有効化 」( autovivification ) と呼ばれます。 この機能は以前は 自動生成 や 自動活性化 等と呼ばれていたそうです。


NEXT



次回は、「 自動有効化 」を利用した具体的な処理を確認します。


参考情報は書籍「 続・初めての Perl 改訂版 」, 「 Effective Perl 第 2 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index



























同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲