2010-04-08 4 views
6

참조가 유효한 문자열 강제 변환 (예 : 제대로 로그에 인쇄되거나 데이터베이스에 저장 될 수 있는지)을 결정해야하는 경우 (다양한 데이터 변경 사항을 기록하면서) 상황이 발생했습니다. 이이 작업을 수행하는 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에서

답변

6

:

overload::StrVal(arg)

는 캐릭터 라인 화 오버로드의 부재에서와 같이 arg의 문자열 값을 제공합니다. overload::Method 여기 because 적합하지 않은 것으로

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

참고 :

  • 'bool'

      , '""', '0+',

    하나 이러한 작업의 두 가지 경우에 과부하가 걸리지는 나머지 것들을 대신 사용할 수 있습니다.

    따라서 '""'이 과부하 일 때만 검사하면 질문에 표시되는 방법에 비해 잘못된 음수가 반환됩니다.

  • +0

    나는 당신의 이전 버전이 더 좋았으며, 그것은 stringification 방법을 찾는 법을 보여주었습니다. 'perl -MDateTime -Moverload -wle'my $ dt = DateTime-> now; my $ method = overload :: Method ($ dt, q { ""}); print $ method -> ($ dt) '':) – Ether

    +0

    @Ether 문제는'bool'이 과부하가 걸리지 않고 문자열을 제공하는 것을 과부하했을 수 있다는 것이다. –

    관련 문제