2010-04-13 16 views
5

क्या मैं कभी कभी अपने आप को लिख

s/(something)// ; 
    my $x = $1 ; 

तो मुझे लगता है कि अगर s/// विफल रहता है $1 एक पिछले मैच से एक मूल्य से अधिक ले जाने के किया जा सकता है खोजने के पर्ल में एक प्रतिस्थापन से मैच में चर उठा के स्पष्ट तरीका है, । तो मैं

my $x = 'defaultvalue' ; 
    if (s/(something)//) 
    { 
    $x = $1 ; 
    } 

क्या यह करने का सबसे साफ तरीका है?

उत्तर

2

के रूप में अन्य लोगों, ने बताया है TIMTOWTDI: की पूर्वता "और" और "या" बहुत कम इतना है कि आप सुरक्षित रूप से कोष्ठक की आवश्यकता के बिना एक सूची ऑपरेटर के बाद उनका उपयोग कर सकते है, तथापि,।

मैं personnally इसे एक भी अभिव्यक्ति के रूप में, लपेट चाहते हैं ताकि बिंदु से बहुत ज्यादा विचलित करने के लिए नहीं:

my $x = s/(something)// ? $1 : 'defaultvalue'; 
+0

3 साल बाद इस प्रश्न पर वापस आकर, कार्यात्मक लेन का अध्ययन किया गाइड, इस दृष्टिकोण में योग्यता है। – justintime

4

TMTOWTDI।

मुहावरेदार पर्ल आमतौर पर देखा हो सकता है somthing की तरह:

my $x='defaultvalue'; 

$x=$1 if (s/(something)//) ; 
+2

इसके अलावा 'रों /(...)// && ($ x = $ 1) ',' $ x = s /(...)//?$ 1: 'defaultvalue'', आदि – mob

+0

और बहुत ही मूर्खतापूर्ण '$ x = $ defaultvalue जब तक (s/(कुछ)/$ x = $ 1/ई) 'जो केवल दुखियों के लिए अनुशंसित है ;-) – dawg

1

@mobrule टिप्पणी है कि आप

s{(...)}{} && ($x=$1) 

उपयोग कर सकते हैं में बताते हैं मैं

s{(...)}{} and $x = $1; 

मैं इस्तेमाल किया सिफारिश करेंगे s{}{} क्योंकि जब मैं मार्कडाउन // को पी में टिप्पणियों के रूप में चिह्नित करता हूं तो मुझे इससे नफरत है एरल कोड

and&& से कम प्राथमिकता है जो असाइनमेंट के आस-पास कोष्ठक को हटाने में सक्षम बनाता है।

perldoc perlop से:

&& और || जब नियंत्रण प्रवाह के लिए इस्तेमाल करने के लिए अधिक पठनीय विकल्प के रूप में, पर्ल and और or ऑपरेटरों (नीचे देखें) प्रदान करता है। शॉर्ट-सर्किट व्यवहार समान है।

1

यह बहुत ही व्यक्तिपरक है, और सबसे अच्छा जवाब पर कितनी अच्छी तरह बहुत निर्भर करेगा यह आपकी कोडिंग शैली से मेल खाता है, लेकिन मैं अपनी टोपी को अंगूठी में फेंक दूंगा।

चूक के साथ कार्य के लिए मेरा पसंदीदा तृतीयक ऑपरेटर है:

my $x = ($data =~ s/(foo)//) ? $1 : 'defaultvalue'; 
हालांकि नई

(ठीक है, नहीं है कि नए, 5.10 यह शुरू की) "परिभाषित या" ऑपरेटर में तृतीयक बयान की आवश्यकता को कम कर सकते हैं कई मामलों।मैं आम तौर पर इस तरह के रूप में इसका इस्तेमाल:

my $var = defined($candidate) ? $candidate : 'default'; 

लेकिन अब के लिए सरल किया जा सकता:

my $var = $candidate // 'default'; 

या

my $var = 'default'; 
$var //= $candidate; 
+0

बस '//' ऑपरेटर से सावधान रहें और बहुत अधिक उपयोग करने की कोशिश कर रहे हैं, आपको मिल सकता है: '$ x = (s /...//, $ 1) // $ defaultvalue' जो' $ का एक और अधिक पठनीय रूप है एक्स = (एस /...//, $ 1) || ($ डिफ़ॉल्ट मूल्य) 'हालांकि यह कई मामलों में काम करता है, यह मैच का परीक्षण नहीं कर रहा है - यह परिभाषित $ 1 का परीक्षण कर रहा है। एक एकल ब्लॉक में ठीक है, मौत अगर इस परीक्षण में एक असफल मैच के साथ एक सफल पिछले मैच था। यही कारण है कि मुझे अधिक प्रत्यक्ष '$ x = $ 1 पसंद है यदि (एस /...//)। 'हर मामले और हर ब्लॉक में काम करता है। – dawg

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

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