2010-07-23 13 views
9

आम तौर पर अगर आप regex के साथ एक चर में परिवर्तन करना चाहते आप ऐसा करते हैं:एक चर को सेट किए बिना पर्ल इनलाइन रेगेक्स कैसे करें?

$string =~ s/matchCase/changeCase/; 

लेकिन वहाँ एक तरह से बस इसे वापस चर के लिए सेटिंग के बिना इनलाइन की जगह करने के लिए है?

मैं कुछ इस तरह में इसका इस्तेमाल करना चाहते हैं:

my $name="jason"; 
print "Your name without spaces is: " $name => (/\s+/''/g); 

कुछ इस तरह, एक तरह से PHP में preg_replace समारोह की तरह।

+1

प्रतिस्थापन ऑपरेटर के इंटरफेस एक अच्छा नहीं है डिज़ाइन। [(मैंने पहले ही इस तरह कुछ ऐसा कहा है।)] (Http://stackoverflow.com/questions/3319170#comment-3443516) [p5p] पर बात है (http://www.socialtext.net/perl5 /index.cgi?p5p) इसमें एक झंडा जोड़ने के लिए, यह बदली हुई स्ट्रिंग देता है। – daxim

उत्तर

11

पर्ल 5.14 के लिए संशोधित।

5,14 के बाद से, /r झंडा वापसी के लिए प्रतिस्थापन के साथ, आप ऐसा कर सकते हैं:

print "Your name without spaces is: [", do { $name =~ s/\s+//gr; } 
    , "]\n"; 

आप map और एक शाब्दिक चर का उपयोग कर सकते हैं।

my $name=" jason "; 

print "Your name without spaces is: [" 
    , (map { my $a = $_; $a =~ s/\s+//g; $a } ($name)) 
    , "]\n"; 

अब, आप एक शाब्दिक क्योंकि $ _ उर्फ ​​ और इस तरह अपने चर को संशोधित करेगा उपयोग करना होगा।

उत्पादन

Your name without spaces is: [jason] 
# but: $name still ' jason ' 

वैसे do बस के रूप में अच्छी तरह से (और शायद बेहतर) काम करेगा

print "Your name without spaces is: [" 
    , do { my ($a = $name) =~ s/\s+//g; $a } 
    , "]\n"; 

लेकिन शाब्दिक नकल अभी भी वहाँ है। my में असाइनमेंट एक संक्षेप है कि कुछ लोग पसंद करते हैं (मुझे नहीं)।

इस मुहावरे के लिए, मैं एक ऑपरेटर मैं filter फोन का विकास किया है:

sub filter (&@) { 
    my $block = shift; 
    if (wantarray) { 
     return map { &$block; $_ } @_ ? @_ : $_; 
    } 
    else { 
     local $_ = shift || $_; 
     $block->($_); 
     return $_; 
    } 
} 

और आप इसे इतना पसंद किया फोन:

print "Your name without spaces is: [", (filter { s/\s+//g } $name) 
    , "]\n"; 
+3

या आप 'नक्शा' का उपयोग किए बिना एक अक्षीय चर का उपयोग कर सकते हैं:' प्रिंट 'रिक्त स्थान के बिना आपका नाम है: [", {मेरा $ a = $ name करें; $ एक = ~ s/\ s + // छ; $ a}, "] \ n" ' – mob

+1

@ mobrule: जैसा कि आपने टाइप किया था, मैं इसे जोड़ रहा था। : डी – Axeman

+0

इसे स्वीकार किया गया क्योंकि इसमें अधिक स्पष्टीकरण है। –

1
print "Your name without spaces is: @{[map { s/\s+//g; $_ } $name]}\n"; 
संबंधित मुद्दे