2012-04-18 12 views
6

मैंआधिकारिक नियमित अभिव्यक्ति (रों) printf प्रारूप स्ट्रिंग

साथ this question जवाब देने के लिए डेटा हैश करने के लिए पर्ल के फैंसी स्वरूपण और बंद पहुँच के सभी प्राप्त करने के लिए चाहते हैं, तो आप एक (इस का बेहतर संस्करण) की जरूरत है समारोह:

# sprintfx(FORMAT, HASHREF) - like sprintf(FORMAT, LIST) but accepts 
# "%<key>$<tail>" instead of "%<index>$<tail>" in FORMAT to access the 
# values of HASHREF according to <key>. Fancy formatting is done by 
# passing '%<tail>', <corresponding value> to sprintf. 
sub sprintfx { 
    my ($f, $rh) = @_; 
    $f =~ s/ 
    (%%)    # $1: '%%' for '%' 
    |     # OR 
    %     # start format 
    (\w+)    # $2: a key to access the HASHREF 
    \$     # end key/index 
    (     # $3: a valid FORMAT tail 
         # 'everything' upto the type letter 
     [^BDEFGOUXbcdefginosux]* 
         # the type letter ('p' removed; no 'next' pos for storage) 
     [BDEFGOUXbcdefginosux] 
    ) 
    /$1 ? '%'       # got '%%', replace with '%' 
     : sprintf('%' . $3, $rh->{$2}) # else, apply sprintf 
    /xge; 
    return $f; 
} 

लेकिन मैं प्रारूप स्ट्रिंग की 'पूंछ' पर कब्जा करने के लिए जोखिम भरा/जानवर बल दृष्टिकोण के शर्मिंदा हूँ।

तो: क्या FORMAT स्ट्रिंग के लिए नियमित अभिव्यक्ति है जिसे आप भरोसा कर सकते हैं?

+0

क्या आप जानते हैं कि '%%' 'sprintf' में एक विशेष मामला नहीं है? उदाहरण के लिए 'sprintf ('% 2% ')' स्ट्रिंग ''% ''का उत्पादन करेगा। –

उत्तर

0

स्वीकार्य प्रारूप perldoc -f sprintf में स्वीकार्य प्रारूप बहुत अच्छी तरह से सामने आया है। '%' और प्रारूप पत्र के बीच, आप हो सकता है:

 (\d+\$)?   # format parameter index (though this is probably 
         # incompatible with the dictionary feature) 

    [ +0#-]*   # flags 

    (\*?v)?   # vector flag 

    \d*    # minimum width 

    (\.\d+|\.\*)? # precision or maximum width 

    (ll|[lhqL])?  # size 
+0

समस्या यह है कि कुछ संशोधक केवल कुछ प्रारूप विनिर्देशकों पर लागू होते हैं। –

+0

ओपी 'स्प्रिंटफ' को फिर से लागू करने की कोशिश नहीं कर रहे, निर्मित 'स्प्रिंटफ' के प्रारूप प्रारूप टोकन पास कर रहा है। यदि इनपुट में एक अमान्य अनुक्रम होता है, तो इसे संभाला जाएगा, पर्ल की 'स्प्रिंटफ' इसे संभालेगी, जो वांछित व्यवहार हो सकती है। – mob

+0

उदा।, 'Sprintfx "% (abc) बनाम", {abc => "def"} के आउटपुट को क्या करना चाहिए; 'हो? क्या यह '% (एबीसी) बनाम होना चाहिए या क्या यह'% बनाम 'होने के लिए स्वीकार्य है? – mob

1

आप यह वास्तव में पर्ल की तरह कैसे करना है पूछ रहे हैं, तो परामर्श क्या पर्ल करता है।

Perl_sv_vcatpvfnsprintf प्रारूप पार्सर और मूल्यांकनकर्ता है। (5.14.2 के कार्यान्वयन से लिंक करें।)

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