2016-12-22 11 views
5

मैं सोच रहा था कि क्या एक ही रेगेक्स/प्रतिस्थापन का उपयोग करके मूल्यों को स्वैप करने का एक आसान/साफ तरीका है?स्वैपिंग मान

यदि $ "x" के साथ $ एक सिरे, इसे "वाई" के साथ प्रतिस्थापित करें। और इसी तरह अगर $ "y" के साथ एक छोर, साथ "x" यह स्वैप:

$a = "test_x"; 

if ($a =~ /x$/) { 
    $a =~ s/x$/y/; 
} else { 
    $a =~ s/y$/x/; 
} 

मैं केवल कुछ इस तरह के बारे में सोच सकते हैं:

$a = $a =~ /x$/ ? s/x$/y/ : s/y$/x/; 

उत्तर

10

यह केवल है:

$a =~ s/x$/y/ or $a =~ s/y$/x/; 

यह लगभग हमेशा है यह देखने के लिए कि क्या आपको प्रतिस्थापन करना चाहिए, एक मैच करने के लिए अनावश्यक है।

एक और तरीका है:

substr($a,-1) =~ y/xy/yx/; 
+0

यह बहुत अच्छा है, धन्यवाद! – Subbeh

5

आप आप की तरह एक पंक्ति में निचोड़ कर सकते हैं दिखाएं, शायद /r (v5.14 + के साथ) के साथ थोड़ा सा अच्छा।

या आप एक हैश तैयार कर सकते हैं। यह हार्ड-कोडिंग विशेष वर्णों से कोड को भी राहत देता है।

my %swap = (x => 'y', y => 'x', a => 'b', b => 'a'); # expand as needed 

my @test = map { 'test_' . $_ } qw(x y a b Z); 

for my $string (@test) 
{ 
    $string =~ s| (.)$ | $swap{$1} // $1 |ex; 

    say $string; 
} 

// (परिभाषित या) वहाँ इस मामले में जहां पिछले चरित्र हैश में नहीं है, संभाल करने के लिए है जो मामले $swap{$1} रिटर्न undef में। टिप्पणी के लिए user52889 पर धन्यवाद।

+0

'रों /(.)$/$ स्वैप {$ 1}/e': आप शायद भी इस मामले में जहां अंतिम चरित्र न' x' है और न ही 'y है हैंडल करना चाहते हैं '। – user52889

+0

@ user52889 वास्तव में - धन्यवाद! फिक्स्ड। – zdim

+0

अच्छा साफ समाधान, धन्यवाद! – Subbeh

3

व्यक्तिगत वर्णों को स्वैप करने के लिए, आप tr/// का उपयोग कर सकते हैं।

सुनिश्चित नहीं हैं कि सफाई या आसानी के लिए अपने मापदंड हैं, लेकिन आप भी प्रतिस्थापन की दाहिने हाथ की ओर के अंदर ऐसा कर सकता है:

$xy = "test_x" =~ s`([xy])$`$1=~tr/xy/yx/r`re; # $xy is "test_y" 
+0

या इस अनुकूलित संस्करण का उपयोग करें: '$ a = ~ s/.$/$&= ~ y, xy, yx, r/e;'। लेकिन केवल तभी ऐसा करें जब आप उन लोगों से नफरत करते हैं जिन्हें आपका कोड पढ़ना होगा! –

+2

किस के लिए अनुकूलित किया गया? कुछ $ पर '$ &' प्रदर्शन दंड है। – user52889

+1

स्पष्ट रूप से कोड को पढ़ने वाले लोगों को परेशान करने के लिए अनुकूलित किया गया। –

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