ref

refでリファレンスの情報を返す。

Perlの組み込み関数 ref の翻訳 - perldoc.jp

リファレンスなら、"SCALAR"とか"ARRAY"とか何のリファレンスかを文字列で返し、リファレンスでない場合、偽として空文字列を返す。

変数といろんなリファレンスをチェックしてみる。

$ vi ref.pl
$ perl ref.pl

SCALAR
ARRAY
HASH
CODE
$

最初は変数なので、何も返ってこないというか空文字列。
それ以降は何のリファレンスか返ってきてる。

Sample/perl/ref/ref/src/ref at master · bg1bgst333/Sample · GitHub

無名サブルーチン

無名サブルーチンというものもある。

サブルーチンのリファレンス - Perl入門ゼミ

名前のないサブルーチンをその場で定義して、リファレンスとして変数に持っておける。

$$でデリファレンスして10と20を渡すと、

$ vi sub.pl
$ perl sub.pl
30
$

足されて30が返る。

Sample/perl/sub/anonymous_sub/src/sub at master · bg1bgst333/Sample · GitHub

無名ハッシュ

無名配列と同様に、無名ハッシュも作ることが出来る。

無名ハッシュ生成子 - ハッシュのリファレンスを作成 - Perl入門ゼミ

ハッシュの場合は、{}でキーと値を定義すると、それが無名ハッシュのリファレンスになる。

%$でハッシュ全体、$$~{}で要素の値。

$ vi hash.pl
$ perl hash.pl
HASH(0x55ef6f691278)
2
value1
value2
$

型情報、ハッシュサイズ、各要素。

Sample/perl/hash/anonymous_hash/src/hash at master · bg1bgst333/Sample · GitHub

無名配列

リファレンスの応用として、無名配列を使うことが出来る。

無名配列生成子 [] - 配列のリファレンスを簡単に作成 - Perl入門ゼミ

要素を並べて[]で囲むと無名配列のリファレンスになるので、それをデリファレンスすれば要素の参照や操作ができる。

@$で配列全体を示し、$$~[]で要素の値を示す。

$ vi array.pl
$ perl array.pl
ARRAY(0x559e38d3f278)
3
1
2
3
$

型情報、配列サイズ、ときて各要素の値。

Sample/perl/array/anonymous_array/src/array at master · bg1bgst333/Sample · GitHub

リファレンスのリファレンス

ポインタへのポインタと同様に、リファレンスのリファレンスというものも使える。

perlref - Perlのリファレンスとネストしたデータ構造 - perldoc.jp

\\というように2回付ける場合は、$$$というように3回付けてデリファレンスする。

$ vi reference.pl
$ perl reference.pl
REF(0x55d32d99a278)
SCALAR(0x55d32d9c8b90)
ABCDE
$

最初は、リファレンスであることを示している。
そして、スカラー変数。
最後に変数の値が取得できる。

Sample/perl/reference/reference_to_reference/src/reference at master · bg1bgst333/Sample · GitHub

リファレンス

リファレンスは、C言語のポインタのようなものであり、変数、配列、ハッシュ、サブルーチン、などが格納されているアドレスを示す。

perlref - Perlのリファレンスとネストしたデータ構造 - perldoc.jp
Perl/リファレンス - Wikibooks

変数などを代入する時、\を付けるとリファレンスを返すようになっている。
変数の場合は、リファレンスの参照先の値を返す(デリファレンスと呼ぶ)場合は、$を付ける。

$ vi reference.pl
$ perl reference.pl
SCALAR(0x55cc1245cb70)
ABCDE
$

リファレンスをそのままprintすると、型やアドレスが出力される。
デリファレンスで、格納していた値が出力される。

Sample/perl/reference/reference/src/reference at master · bg1bgst333/Sample · GitHub