我遇到了一种情况(在记录各种数据更改时),我需要确定引用是否具有有效的字符串强制(例如,可以正确地打印到日志中或存储在数据库中)。在Scalar::Util中没有任何东西可以做到这一点,所以我使用该库中的其他方法拼凑了一些东西:
use strict;
use warnings;
use Scalar::Util qw(reftype refaddr);
sub has_string_coercion
{
my $value = shift;
my $as_string = "$value";
my $ref = ref $value;
my $reftype = reftype $value;
my $refaddr = sprintf "0x%x", refaddr $value;
if ($ref eq $reftype)
{
# base-type references stringify as REF(0xADDR)
return $as_string !~ /^${ref}\(${refaddr}\)$/;
}
else
{
# blessed objects stringify as REF=REFTYPE(0xADDR)
return $as_string !~ /^${ref}=${reftype}\(${refaddr}\)$/;
}
}
# Example:
use DateTime;
my $ref1 = DateTime->now;
my $ref2 = \'foo';
print "DateTime has coercion: " . has_string_coercion($ref1) . "\n\n";
print "scalar ref has coercion: " . has_string_coercion($ref2) . "\n";然而,我怀疑有一种更好的方法来确定这一点,那就是以某种方式检查变量的内部。如何才能做得更好?
发布于 2010-04-09 02:09:42
来自perldoc overload
overload::StrVal(arg)
在没有stringify重载的情况下给出arg的字符串值。
sub can_stringify {
my ($obj) = @_;
return "$obj" ne overload::StrVal($obj);
}请注意,在这里because不适合使用overload::Method
'bool','""','0+',如果这些操作中的一个或两个没有重载,则可以使用其余的操作。
因此,与您在问题中显示的方法相比,只检查'""'是否重载将返回假阴性。
https://stackoverflow.com/questions/2602321
复制相似问题