检查 EXPR 的值,预期它是一个引用,并返回一个字符串,提供有关引用和引用类型的信息。如果未指定 EXPR,则将使用 $_
。
如果操作数不是引用,则将返回空字符串。在这种情况下,只会返回空字符串。ref
通常用于测试一个值是否为引用,这可以通过将结果与空字符串进行比较来完成。使用 ref
的结果作为真值是一个常见的错误:这会出错,因为 0
(为假)可以为引用返回。
如果操作数是对已祝福对象的引用,则将返回将引用祝福到的类的名称。ref
不关心引用的物理类型;祝福优先于此类问题。请注意,ref
结果与类名进行精确比较不会执行类成员资格测试:类的成员还包括祝福到子类的对象,对于这些对象,ref
将返回子类的名称。还要注意,类名可能会与内置类型名冲突(如下所述)。
如果操作数是对未祝福对象的引用,则返回值表示对象的类型。如果未祝福的引用不是标量,则返回值将是字符串 ARRAY
、HASH
、CODE
、FORMAT
或 IO
之一,仅指示它是哪种类型的对象。如果未祝福的引用是标量,则返回值将是字符串 SCALAR
、VSTRING
、REF
、GLOB
、LVALUE
或 REGEXP
之一,具体取决于标量当前具有的值类型。但请注意,qr//
标量在创建时就已经被祝福,因此 ref qr/.../
可能会返回 Regexp
。请注意,这些内置类型名称也可以用作类名,因此 ref
返回这些名称之一并不明确地表明引用是与名称所指类型相同的类型。
内置类型名称和类名之间的歧义极大地限制了 ref
的效用。为了获得明确的信息,请使用 Scalar::Util::blessed()
获取有关祝福的信息,并使用 Scalar::Util::reftype()
获取有关物理类型的信息。使用 isa
方法 进行类成员资格测试,但必须确保祝福后再尝试方法调用。或者,isa
运算符 可以测试类成员资格,而无需先检查祝福。