ref

参照先の型を調べる

構文

解説

ref は、EXPR に与えた参照(リファレンス)が指している参照先の型を表す文字列を返します。 EXPR が省略されたら、$_ が使われます。

EXPR が参照でない場合、空文字列が返されます。参照であれば空文字列を返すことはありません。 そのため、ref は、EXPR が参照かどうかをテストするのに良く使われます。 しかし、ref の結果をそのまま真偽値として使うのは間違いです。 とうのも、EXPR が参照だとしても ref は 0 を返す可能性があるからです。 EXPR が参照かどうかをテストするなら、ref の戻り値が正確に空文字列かどうかを評価するべきです。

if ( ref($var) eq '' ) {
    # リファレンスではない場合
}
else {
    # リファレンスの場合
}

ref は参照 EXPR の参照先の値の型に応じて返す文字列が変わります。

ref の戻り値 参照先の値の型
"ARRAY" 配列
"HASH" 連想配列(ハッシュ)
"CODE" サブルーチン
"FORMAT" フォーマット
"SCALAR" スカラー
"VSTRING" バージョン文字列
"REF" リファレンス
"GLOB" 型グロブ
"LVALUE" 左辺関数
"Regexp" 正規表現

※ ref の戻り値に "IO" も存在するようですが、どのような状況でそれが返されるのかは不明。

次のコードは、どのような状況で、ref がどんな値を返すのかを示したものです。

# 配列
my $ary_ref = [ 1, 2, 3 ];
print ref($ary_ref), "\n";    # ARRAY

# 連想配列(ハッシュ)
my $hash_ref = { foo => 1, bar => 2 };
print ref($hash_ref), "\n";    # HASH

# サブルーチン
sub my_func { }                   # 名前付きサブルーチン
my $my_func_ref = \&my_func;
print ref($my_func_ref), "\n";    # CODE

my $func = sub { print "Hello" }; # 無名サブルーチン
print ref($func), "\n";           # CODE

# フォーマット
format fmt =
   Test: @<<<<<<<< @||||| @>>>>>
.
print ref( *fmt{FORMAT} ), "\n";    # FORMAT

# スカラー
my $str     = "Hello";
my $str_ref = \$str;
print ref($str_ref), "\n";          # SCALAR

# バージョン文字列
my $ver = v5.30.0;
print ref( \$ver ), "\n";           # VSTRING

# リファレンス
my $ref_ref = \$str_ref;
print ref($ref_ref), "\n";          # REF

# 型グロブ (ファイルハンドルなど)
open my $fh, '>', './sample.txt';
print ref($fh), "\n";               # GLOB

# 左辺値関数
my $lval = \substr( $str, 2 );
print ref($lval), "\n";             # LVALUE

# 正規表現
my $regexp = qr/^\d+$/;
print ref($regexp), "\n";           # Regexp

EXPR がクラスオブジェクト(bless されたオブジェクトへの参照)の場合は、 クラスの名前が返されます。

use IO::Socket;
my $sock = IO::Socket::INET->new();
print ref($sock), "\n";    # IO::Socket::INET