Я столкнулся с ситуацией (при входе различных изменений данных), где я должен определить, имеет ли ссылка приведение допустимой строки (например, может правильно быть распечатан в журнал или сохранен в базе данных). В Скаляре нет ничего:: 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";
Однако я подозреваю, что мог бы быть лучший способ определить это путем осмотра кишок переменной в некотором роде. Как это может быть добито большего успеха?
Из перегрузка perldoc :
overload :: StrVal (arg)
Возвращает строковое значение
arg
, как при отсутствии перегрузки строкового преобразования.
sub can_stringify {
my ($obj) = @_;
return "$obj" ne overload::StrVal($obj);
}
Обратите внимание, что overload :: Method
здесь не подходит , потому что :
'bool'
,'""'
,] '0 +'
,Если одна или две из этих операций не перегружены, вместо них можно использовать оставшиеся.
Следовательно, проверка только того, что '""'
перегружено, вернет ложноотрицательные результаты по сравнению с методом, который вы указываете в своем вопросе.