2012-01-19 24 views
22

मैं पर्ल 5.8 पर हूं और मुझे डिफ़ॉल्ट मान असाइन करने की आवश्यकता है।टर्नरी ऑपरेटर का उपयोग करके असाइन करना?

if ($model->test) { 
    $review = "1" 
} else { 
    $review = '' 
} 

$model->test का मान न तो "1" या अपरिभाषित होने जा रहा है: मैं यह कर समाप्त हो गया। अगर $model->test में कुछ है, तो $review से "1" पर सेट करें अन्यथा इसे '' के बराबर सेट करें।

क्योंकि यह पर्ल 5.10 नहीं है, मैं नई swanky परिभाषित या ऑपरेटर का उपयोग नहीं कर सकता। मेरी पहली प्रतिक्रिया इस तरह के टर्नरी ऑपरेटर का उपयोग करना था ...

defined($model->test) ? $review = "1" : $review = ''; 

लेकिन यह भी काम नहीं करता था।

क्या किसी को यह पता है कि इसे और अधिक कुशलता से कैसे असाइन किया जाए?

$review = (defined($model->test) ? 1 : ''); 

जहाँ कोष्ठक अन्य लोगों कोड को पढ़ने के लिए स्पष्टता के लिए कर रहे हैं: जेनी

+0

आप वास्तव में स्थापित करना चाहिए यह करने के लिए '1' नहीं करने के लिए' '' '। दोनों में एक ही स्ट्रिंग प्रतिनिधित्व ('''') है। केवल अंतर यह है कि अगर आप इसे एक संख्या के रूप में उपयोग करने का प्रयास करते हैं, तो '' 'चेतावनी देगा, जहां '! 1' नहीं होगा। (मान लीजिए कि आपके पास हमेशा पर्ल कोड के प्रत्येक टुकड़े के शीर्ष पर 'चेतावनियों का उपयोग करें'; आपको –

उत्तर

32

मैं आमतौर पर के रूप में लिख चाहते हैं।

+0

धन्यवाद ग्रेग! मैं पूछने के लिए अजीब महसूस करता हूं क्योंकि ऐसा लगता है जैसे यह आसान होगा। (और यह है!) जेडब्ल्यू –

+0

@ जेन विल्की असल में, यह उससे भी आसान है, यहां तक ​​कि। मेरा जवाब देखें – tchrist

+0

बेशक WAY बेहतर जवाब बीआईटी (1) के बजाय CHS (1) में MySQL की परिभाषा को बदलना होगा, लेकिन दुख की बात है कि हमारे उत्पादन वातावरण में यह कुछ आसान बदलने की राजनीति बहुत बड़ी है। –

9

$model->test या तो "1" या अपरिभाषित होने जा रहा है। वहाँ $model->test में कुछ है, तो सेट $review"1" को अन्यथा यह ''

तो बस का उपयोग इस सेट:

$review = $model->test || ""; 
+0

उसी धागे में टॉम और फोय। लैरी वॉल कहां है? मैं चाहता हूं कि हम सब तैयार हों ताकि मैं आपकी तस्वीर आपके साथ ले सकूं। – Alhadis

2

सबसे पहले, "यह काम नहीं किया या तो" सबसे उपयोगी बात नहीं है आप हमें बता सकते हैं। यह जानना महत्वपूर्ण है कि कैसे यह काम नहीं किया: यह क्या किया, आपने क्या उम्मीद की, और वे अलग-अलग कैसे हो सकते हैं?

लेकिन

defined($model->test) ? $review="1" : $review=''; 

के साथ समस्या यह ऑपरेटर पूर्वता है। सशर्त ऑपरेटर ? : असाइनमेंट ऑपरेटर = की तुलना में अधिक मजबूती से बांधता है, इसलिए ऊपर के बराबर है: अगर $model->test परिभाषित किया गया है

(defined($model->test) ? $review="1" : $review) = ''; 

इसलिए, यह

$review = "1" = ''; 

आपको लगता है कि इस समस्या को ठीक कर सकते हैं के बराबर होता है कोष्ठक के साथ:

defined($model->test) ? ($review="1") : ($review=''); 

लेकिन वास्तव में, आप क्यों चाहेंगे? जब आप परिणाम का उपयोग करना चाहते हैं तो सशर्त (टर्नरी) ऑपरेटर उपयोगी होता है।परिणाम, खारिज किया जा करने के लिए के रूप में यह यहाँ है जा रहा है, तो यह स्पष्ट है (और, जैसा कि आप देखा है, त्रुटि-रहित होता) एक अगर/बाकी कथन का उपयोग करने के लिए:

if (defined($model->test) { 
    $review = "1"; 
} 
else { 
    $review = ""; 
} 

या, अगर आप जोर देते हैं एक पंक्ति में यह लिखने पर:

if (defined($model->test) { $review = "1"; } else { $review = ""; } 

तुम सच में एक सशर्त अभिव्यक्ति का उपयोग करना चाहते हैं, तो आप ऐसा कर सकते हैं:

$review = defined($model->test) ? "1" : ""; 

जो शायद यह करने के लिए एक उचित तरीका है।

लेकिन:

defined ऑपरेटर ही पैदावार या तो "1" (सही) या "" (गलत)। इसलिए पूरी चीज को घटाया जा सकता है:

$review = defined($model->test); 
+0

क्या होगा यदि 'undef' सिर्फ एक झूठा मान है, और विधि' '' या '0' को गलत मान के रूप में वापस करने के लिए फिर से लिखी जाती है? –

+0

@ ब्रैड गिल्बर्ट: तो मुझे लगता है कि आप इसे 'परिभाषित' लागू नहीं करना चाहते हैं। आपको स्पष्ट रूप से यह जानने की आवश्यकता है कि इसका उपयोग करने में सक्षम होने के लिए विधि क्या है। –

+0

यह हर दूसरे उपयोग के लिए उपयुक्त मूल्य प्रदान करने के लिए परीक्षण() का काम नहीं है और यह उस पर भरोसा करने के लिए खराब रूप होगा। उस तरह की चीजें तंग युग्मन और कठिन परीक्षण की ओर ले जाती हैं। –

20

आपके पास प्राथमिकता समस्या है। आपके पास

(defined($model->test) ? $review="1" : $review) = ''; 

जैसा आप इसे माता-पिता के साथ काम कर सकते हैं।

my $review; $model->test ? ($review='1') : ($review=''); 

लेकिन असाइनमेंट को स्थानांतरित करने के लिए यह बहुत साफ है।

my $review = $model->test ? '1' : ''; 
बेशक

, तो आप बस एक रिक्त स्ट्रिंग पर

my $review = $model->test || ''; 

लेकिन परिवर्तन undef इस्तेमाल कर सकते हैं?

my $review = $model->test; 
1
my $result = defined $model->test ? '1' : ''; 
+0

जो '$ परिणाम' को लगभग उसी मूल्य पर सेट करता है, केवल '$ result = परिभाषित $ मॉडल-> परीक्षण;'। मुख्य अंतर यह है कि यदि आपकी संख्या किसी संख्या के रूप में उपयोग की जाती है तो चेतावनी दी जाएगी। –

2

मुझे लगता है कि $model->test एक सही या गलत मान देने के लिए माना जाता है।

जब तक यह विशेष रूप से कहता है कि झूठा मान undef है, तो विधि को इसके बजाय कुछ अन्य गलत मूल्य लौटने के लिए फिर से लिखा जा सकता है। जो कुछ भी तोड़ देगा जो केवल तभी जांचता है जब मान परिभाषित किया गया हो।
(मुझे लगता है कि यह एक बग है कि विधि रिटर्न विहित झूठी मान के बजाय undef है।)

तो स्थापित करने के लिए $review दिए गए मान की सच्चाई का परीक्षण करने के लिए सबसे अच्छा तरीका है; यह परिभाषा नहीं है।

my $review = $model->test ? 1 : ''; 

मैं यह इंगित करना चाहता हूं कि इसमें अभी भी एक बग है। यदि आप किसी संख्या के रूप में मान का उपयोग करने में सक्षम होना चाहते हैं, तो यह चेतावनी छोड़ देगा अगर यह गलत था।

यह ठीक करने के लिए कि आपको !1 (कैननिकल झूठा मान) वापस करना चाहिए, जो एक मान वापस करेगा जो स्ट्रिंग '' है, लेकिन इसमें 0 का संख्यात्मक मान भी है।

my $review = $model->test ? 1 : !1; 

सूचना है कि यह करने के लिए बस को सरल बनाया जा सकता है:

my $review = !! $model->test; # invert it twice 

आप केवल मूल्य बदलना चाहते हैं केवल जब यह गलत है, आप या ऑपरेटर || इस्तेमाल कर सकते हैं।

my $review = $model->test || !1; 

तुम सच में ही जानना चाहते हैं कि यह परिभाषित किया गया है, या क्यों तुम सिर्फ defined का उपयोग नहीं करते नहीं चाहते हैं।

my $review = defined $model->test; 

आप मान बदलने के लिए केवल जब यह अनिर्धारित रहता है चाहते हैं, और आप Perl 5.10 है या आप defined-or operator (//) इस्तेमाल कर सकते हैं नए हैं।

my $review = $model->test // !1; 

एक पुराने पर्ल पर, कि एक से अधिक statement की आवश्यकता होगी।

my $review = $model->test; 
$review = !1 unless defined $review; 
7

सशर्त ऑपरेटर इसके अलावा, मैं अक्सर do, जो पिछले का मूल्यांकन अभिव्यक्ति से मान देता है का उपयोग करना चाहते:

my $review = do { 
    if(...) { 'foo' } 
    elsif(...) { 'bar' } 
    elsif(...) { 'baz' } 
    else   { 'defaut' } 
    }; 
+0

यह इस मामले में थोड़ा अधिक है। यद्यपि धन्यवाद, आपके टूलबॉक्स में एक और तकनीक जोड़ने के लायक है। –

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