参照先の型を調べる
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