2009-04-17 13 views
7

मैं अनुवाद के कम करने के लिए पर्ल में कुछ स्ट्रिंग प्रतिस्थापन का उपयोग करने की जरूरत है, यानीपर्ल में printf के बजाय मुझे क्या उपयोग करना चाहिए?

printf ("Outputting %d numbers", $n); 

हालांकि कुछ ऐसा द्वारा की जगह कई

print "Outputting " . $n . " numbers"; 

, मैं आसान कुछ के लिए पार्स करने के लिए साथ printf बदलना चाहते हैं, इंसान, इस तरह:

printX ("Outputting {num} numbers", { num => $n }); 

या आम तौर पर कुछ और अधिक।

क्या आप कुछ पसंद कर सकते हैं (सीपीएएन या नहीं) आप पसंद करते हैं और उपयोग करते हैं?

उत्तर

12

अधिकांश Templating CPAN पर मॉड्यूल शायद आप जो चाहते हैं वह करेंगे। Template Toolkit का उपयोग कर एक उदाहरण यहां दिया गया है ...

use Template; 
my $tt = Template->new; 

$tt->process(\"Outputting [% num %] numbers\n", { num => 100 }); 


और तुम कुछ इस तरह के साथ अपने आवश्यक उदाहरण की नकल कर सकते हैं ...

sub printX { 
    use Template; 
    my $tt = Template->new(START_TAG => '{', END_TAG => '}'); 
    $tt->process(\($_[0] . "\n"), $_[1]); 
} 

और आप मिल गया है ...

printX 'Outputting {num} numbers' => { num => 100 }; 
4

ऐसा लगता है कि आप तारों को पार्स करने का एक अलग तरीका चाहते हैं। मैं आपको सलाह नहीं दूंगा कि ऐसा न करें। एकमात्र जो उसमें% d के साथ वाक्यविन्यास देख रहा है वह डेवलपर है और वह वास्तव में समझ जाएगा कि इसका क्या अर्थ है। printf वाक्य रचना गद्दी जैसे विकल्प की वजह से शक्तिशाली है, दशमलव आदि

मुझे लगता है कि आप और अधिक एक विधि की जगह उपयोग करना चाहते हैं। यह एस/{num}/$ n/करने के लिए परेशान है।

+1

"केवल एक है जो है इसमें% d के साथ वाक्यविन्यास देखकर डेवलपर है "-> यह मामला नहीं है, उन तारों को अनुवादकों और बहुत बेवकूफों द्वारा भी देखा जाएगा :) मैं खुद प्रिंटफ के साथ ठीक हूं लेकिन मुझे दूसरे के बारे में सोचना है लोग ... –

1

अनुवादकों के बारे में आपकी टिप्पणी के प्रकाश में मैं एक पर्ल स्क्रिप्ट लिखने का सुझाव देता हूं जो सभी printf() को स्ट्रिप्स करता है और उन्हें एक और अधिक अनुवादक अनुकूल तरीके से सारणीबद्ध करता है।

कुछ इस तरह:

while(<>) 
{ 
    #regex for striping printf 

    #print in tabulated form 
} 

आप लाइन नंबर का प्रिंट आउट तो भी आप आसानी से किसी अन्य प्रोग्राम अनुवादित पाठ को बदलने के लिए लिख सकते हैं।

यह समाधान आप किसी भी अब फिर से फैक्टरिंग printf() से दूर से नहीं ले जाएगा और यह पुन: प्रयोज्य है।


मैं निश्चित रूप से printf() साथ रहना होगा, यह कई भाषाओं में मानक है।

यह स्ट्रिंग आउटपुट के लिए लगभग मानक बन गया है। i की तरह for लूप के लिए है।

print "Outputting $n numbers"; 

बहुत Perly है कि:

+0

मैं "लूप" का उपयोग करता हूं :-) –

+3

printf के साथ समस्या यह है कि आपको ऑर्डर सही भी प्राप्त करना होगा। यही है, अगर कोई भाषा प्रतिस्थापित वस्तुओं के क्रम को उलट देती है, तो अनुवादक कुछ प्रिंटफ के साथ एसओएल है (कहें, सी)। अनुवाद को आसान बनाने के लिए, आपको "% 1 $ d" का उपयोग करने की आवश्यकता है ताकि वे आसानी से इसे स्थानांतरित कर सकें। टेम्पलेट टूलकिट यह मामूली बनाता है। – Tanktalus

14
के बारे में क्या बस

। यदि आपको किसी भी तरह की फैंसी स्वरूपण की आवश्यकता नहीं है, तो स्ट्रिंग इंटरपोलेशन निश्चित रूप से जाने का तरीका है।

+0

सुझाव के लिए धन्यवाद, मुझे लगता है कि ज्यादातर मामलों में यह उपयुक्त विचार है, हालांकि मैं हमेशा इंटरपोलेटबल वैरिएबल आउटपुट नहीं करता (डम्पर (\% हैश) दिमाग में आता है)। देखना है कि यह कैसे काम करता है, लेकिन मुझे शायद थोड़ा और अधिक लचीला चाहिए ... –

+3

इंटरपोलेशन में मनमाने ढंग से अभिव्यक्तियों को आउटपुट करने के लिए एक मुहावरे है: प्रिंट "हैश है: @ {[डम्पर (\% हैश)]}"; यह सुंदर नहीं है लेकिन यह काम करता है। –

+0

@ ग्रेग हेगिल मुझे नहीं पता था कि आप यह कर सकते हैं - कमाल! – cowgod

-2

अच्छी तरह से, पर्ल printf समारोह ... इंतजार है, तो आपको python's string formatting with dict की तरह कुछ करना चाहते हैं?

>>> print '%(key)s' % {'key': 'value'} 
value 

mmm, मैं पर्ल में मौजूद ऐसा ही कुछ नहीं पता ... कम से कम नहीं यह "आसान" ... शायद Text::Sprintf::Named अपने दोस्त हो सकता है

+0

यदि यह स्पष्ट नहीं था, तो मैं पर्ल के प्रिंटफ की बजाय कुछ का उपयोग करना चाहता हूं, सी के प्रिंटफ नहीं। –

5

print builtin बहुत है ज्यादातर स्थितियों के लिए सुविधाजनक। चर प्रक्षेप इसके अलावा:

print "Outputting $n numbers"; # These two lines 
print "Outputting ${n} numbers"; # are equivalent 

याद रखें कि print कई तर्क ले सकते हैं, तो उन्हें एक ही स्ट्रिंग में पहले श्रेणीबद्ध करने के लिए यदि आप एक सबरूटीन कॉल का परिणाम मुद्रित करने के लिए की जरूरत है कोई जरूरत नहीं है:

print "Output data: ", Dumper($data); 

हालांकि, सरल पूर्णांक के अलावा अन्य संख्याओं को आउटपुट करने के लिए, आप शायद printf की स्वरूपण सुविधा चाहते हैं। हालांकि, अन्य डेटा प्रकारों को आउटपुट करना print के साथ आसान है।

आप join को आसानी से उत्पादन सरणियों का उपयोग कर सकते हैं:

print join ', ', @array; 

और उत्पादन हैश को map और keys के साथ गठबंधन: डेटा के आसपास उत्पादन उद्धरण

print join ', ', map {"$_ : $hash{$_}"} keys %hash; 

उपयोग qq ऑपरेटर अगर आप चाहते हैं :

print join ', ', map {qq("$_" : "$hash{$_}"}) keys %hash; 
5

यदि आप अनुवादों को कम करना चाहते हैं तो आपको उपलब्ध एल 10 एन/i18n सीपीएएन मॉड्यूल में से एक का उपयोग करने पर विचार करना चाहिए। विशेष रूप से, आपका दृष्टिकोण क्यों कम हो जाएगा, इसका एक अच्छा अवलोकन written up as part of the Local::Maketext docs है।

एक और महान मॉड्यूल जो लोकेल :: मकेक्स्ट के साथ अच्छी तरह से जोड़ता है Locale::Maketext::Lexicon है। यह आपको गेटटेक्स्ट की .po/.mo फ़ाइलों जैसे अधिक मानक स्थानीयकरण प्रारूपों का उपयोग करने की अनुमति देता है जिनमें अनुवादक की आवश्यकता वाले सभी पाठों के माध्यम से अनुवादकों की सहायता करने के लिए जीयूआई उपकरण होते हैं। लोकेल :: मकेटेक्स्ट :: लेक्सिकॉन भी एक सहायक स्क्रिप्ट (xgettext.pl) के साथ आता है जो आपके स्थानीयकरण फ़ाइलों को आपके टेम्पलेट्स या मॉड्यूल के साथ अद्यतित रखने में मदद करता है जिसमें टेक्स्ट की आवश्यकता होती है। अतीत में इस तरह के सेटअप के साथ मेरे पास बहुत अच्छे परिणाम हुए हैं।

+0

मैं यहां i18n के बारे में बात नहीं कर रहा हूं (एल :: एम :: लेक्सिकॉन के अलावा पूरी तरह अनुपयुक्त है, इसके बाद और अधिक;), बल्कि अनुवाद के लिए स्ट्रिंग तैयार करना। मेरे काम पर हमें वर्तमान में एक कस्टम अनुवाद प्रणाली का उपयोग करना है जहां तारों को अजीब तरीके से निकाला जाता है। –

1

आम तौर पर Draegtun से जवाब देने के महान है, लेकिन अगर आप कुछ छोटे (यानी कम स्मृति), और के रूप में शक्तिशाली नहीं आप आसानी से इसे इस फ़ंक्शन का उपयोग कर सकते हैं आवश्यकता होगी:

sub printX { 
    my ($format, $vars) = @_; 

    my @sorted_keys = sort { length($b) <=> length($a) } keys %{ $vars }; 
    my $re = join '|', map { "\Q$_\E" } @sorted_keys; 

    $format =~ s/ \{ \s* ($re) \s* \} /$vars->{$1}/xg; 

    print $format; 
} 
संबंधित मुद्दे