簡體   English   中英

如何確定對象或引用是否具有有效的字符串強制?

[英]How can I determine if an object or reference has a valid string coercion?

我遇到了一種情況(記錄各種數據變化時),我需要確定引用是否具有有效的字符串強制(例如,可以正確打印到日志中或存儲在數據庫中)。 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";

但是,我懷疑通過以某種方式檢查變量的內容可能有更好的方法來確定這一點。 怎么能做得更好?

perldoc過載

overload::StrVal(arg)

在沒有stringify重載的情況下給出arg字符串值。

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

請注意,此處的overload::Method不合適, 因為

  1. 'bool''""''0+'

如果這些操作中的一個或兩個沒有過載,則可以使用其余的操作。

因此,與您在問題中顯示的方法相比,只檢查'""'是否過載會返回漏報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM