2010-04-08 13 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"; 

हालांकि, मैं वहाँ संदेह है कि यह निर्धारित करने के लिए एक बेहतर तरीका हो सकता है किसी तरह से परिवर्तनीय। यह बेहतर कैसे किया जा सकता है?

उत्तर

6

perldoc overload से:

overload::StrVal(arg)

stringify से अधिक भार के अभाव में के रूप में arg का स्ट्रिंग मान देता है।

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

ध्यान दें कि overload::Method उचित यहाँ because नहीं है:

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

इनमें से एक या आपरेशन के दो हैं अतिभारित नहीं कर रहे हैं, इसके बजाय शेष का उपयोग किया जा सकता है।

इसलिए, केवल '""' ओवरलोड होने पर जांच करना आपके प्रश्न में दिखाए गए तरीके की तुलना में झूठी नकारात्मकता लौटाएगा।

+0

मुझे आपके पिछले संस्करण को बेहतर पसंद आया, जो दिखाता है कि स्ट्रिंगफिकेशन विधि कैसे ढूंढें - उदा। 'perl -MDateTime -Moverload -wle'my $ dt = dateTime-> अब; मेरी $ विधि = अधिभार :: विधि ($ डीटी, क्यू {""}); $ $ प्रिंट करें -> ($ dt) '':) – Ether

+0

@ अन्य समस्या यह है कि' बूल 'अधिभारित किया जा सकता है बिना' '' '' 'ओवरलोड किए बिना एक स्ट्रिंगफिकेशन प्रदान किया जा सकता है। –

संबंधित मुद्दे

 संबंधित मुद्दे