참조가 유효한 문자열 강제 변환 (예 : 제대로 로그에 인쇄되거나 데이터베이스에 저장 될 수 있는지)을 결정해야하는 경우 (다양한 데이터 변경 사항을 기록하면서) 상황이 발생했습니다. 이이 작업을 수행하는 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에서
나는 당신의 이전 버전이 더 좋았으며, 그것은 stringification 방법을 찾는 법을 보여주었습니다. 'perl -MDateTime -Moverload -wle'my $ dt = DateTime-> now; my $ method = overload :: Method ($ dt, q { ""}); print $ method -> ($ dt) '':) – Ether
@Ether 문제는'bool'이 과부하가 걸리지 않고 문자열을 제공하는 것을 과부하했을 수 있다는 것이다. –