ref

参照先の型を調べる

構文

解説

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

EXPR が参照でない場合、空文字列が返されます。参照であれば空文字列を返すことはありません。 そのため、ref は、EXPR が参照かどうかをテストするのに良く使われます。 しかし、ref の結果をそのまま真偽値として使うのは間違いです。 とうのも、EXPR が参照だとしても ref0 を返す可能性があるからです。 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