Как я могу определить, имеют ли объект или ссылка приведение допустимой строки?

Я столкнулся с ситуацией (при входе различных изменений данных), где я должен определить, имеет ли ссылка приведение допустимой строки (например, может правильно быть распечатан в журнал или сохранен в базе данных). В Скаляре нет ничего:: 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";

Однако я подозреваю, что мог бы быть лучший способ определить это путем осмотра кишок переменной в некотором роде. Как это может быть добито большего успеха?

6
задан Ether 8 April 2010 в 18:02
поделиться

1 ответ

Из перегрузка perldoc :

overload :: StrVal (arg)

Возвращает строковое значение arg , как при отсутствии перегрузки строкового преобразования.

sub can_stringify {
    my ($obj) = @_;
    return "$obj" ne overload::StrVal($obj);
}

Обратите внимание, что overload :: Method здесь не подходит , потому что :

  1. 'bool' , '""' , ] '0 +' ,

Если одна или две из этих операций не перегружены, вместо них можно использовать оставшиеся.

Следовательно, проверка только того, что '""' перегружено, вернет ложноотрицательные результаты по сравнению с методом, который вы указываете в своем вопросе.

6
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: