2011-08-09 13 views
8

निम्नलिखित सामग्रीपूंजीकरण बनाए रखने के दौरान पाठ को कैसे बदलें?

name 
nAmE 
naMEbb 
NAME 

के साथ एक फ़ाइल पर की जगह मैं एक स्ट्रिंग चाहते थे कहो और "डेव" के साथ शब्द "नाम" की जगह चाहता था, लेकिन मूल पाठ का पूंजीकरण रखते हुए। उदाहरण के लिए, मेरी वांछित आउटपुट होगा,

dave 
dAvE 
daVEbb 
DAVE 

वहाँ (तो मैं कई फ़ाइलों में एक में जगह प्रतिस्थापन कर सकते हैं अधिमानतः पर्ल में) कर रहे हैं किसी भी एक-लाइनर्स यह करने के लिए? जब तक दोनों तार ठीक उसी लंबाई है

संपादित समस्या अस्पष्ट है। आइए मान लें कि यह करता है।

+3

मूल और निरंतर स्ट्रिंग एक ही लंबाई है? अन्यथा "एक ही मामले" की परिभाषा संदिग्ध है – enzotib

उत्तर

8

perlFaq पर कुछ समाधान हैं: http://perldoc.perl.org/perlfaq6.html#How-do-I-substitute-case-insensitively-on-the-LHS-while-preserving-case-on-the-RHS?

समाधान में से एक प्रस्तुत वहाँ, एक पंक्ति में प्रतिस्थापन प्रदर्शन करने के लिए एक सबरूटीन (preserve_case) को परिभाषित करते हुए अनुमति देता है:

$string = "this is a TEsT case"; 
    $string =~ s/(test)/preserve_case($1, "success")/egi; 
    print "$string\n"; 
यह प्रिंट

: यह एक सफलता मामले

0

यह पागलपन है, लेकिन है यह काम करता है:

perl -e 'use List::MoreUtils "pairwise"; $_ = "toto naME nAmE"; s/(name)/@x = map(ord, split "", "DAVE"); @y = map(ord>=97?32:0, split "", $1); @c = map chr, pairwise { $a + $b } @x, @y; $" = ""; "@c";/gei; print "$_\n";' 

एक पंक्ति समाधान!

0

मुझे आश्चर्य है कि पर्ल्फाक का उदाहरण गैर-ASCII के लिए काम करता है या नहीं। एक संस्करण है कि XOR हैक का उपयोग नहीं करता हो सकता है:

$text =~ s{$str_to_replace}{my $i=0;join "",map {substr($&,$i++,1)=~/\p{IsLower}/?lc:uc} split //,$str_to_substitute}ieg; 

लेकिन यह केवल काम करता है अगर /i संशोधक स्थान-सक्षम (perllocale देखें)।

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

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