2009-03-20 5 views
11

मैं मरने के बजाय नेट :: एफ़टीपी पर्ल मॉड्यूल में किसी ऑपरेशन के परिणामों की जांच करना चाहता हूं।मैं एक साधारण मरने की बजाय ब्लॉक को 'या' खंड के रूप में कैसे उपयोग करूं?

आमतौर पर आप क्या करेंगे:

$ftp->put($my_file) 
    or die "Couldn't upload file"; 

लेकिन मैं कुछ करना चाहता हूँ किसी और के बजाय सिर्फ इस स्क्रिप्ट में मरने तो मैं करने की कोशिश की:

$ftp->put($my_file) 
    or { 
     log("Couldn't upload $my_file"); 
     return(-1); 
    } 

log("$my_file uploaded"); 

लेकिन पर्ल कह संकलन त्रुटियों की शिकायत:

syntax error at toto.pl line nnn, near "log" 

जो मेरे कोड खंड में दूसरा लॉग है।

किसी भी सुझाव की सराहना की।

चियर्स,

उत्तर

26

do है आप जो खोज रहे हैं:

यहाँ छोटा कोड स्निपेट है

unless($ftp->put($my_file)) { # OR if (!$ftp->put... 
     log("Couldn't upload $my_file"); 
     return(-1); 
} 

हैं:

$ftp->put($my_file) 
    or do { 
     log("Couldn't upload $my_file"); 
     return(-1); 
    }; 

log("$my_file uploaded"); 

लेकिन इस शायद बेहतर शैली है आप बस एक त्रुटि स्थिति वापस करना चाहते हैं, तो आप die और कॉलिंग func में eval का उपयोग कर सकते हैं।

use English qw<$EVAL_ERROR>; # Thus, [email protected] <-> $EVAL_ERROR 

eval { 
    put_a_file($ftp, $file_name); 
    handle_file_put(); 
}; 

if ($EVAL_ERROR) { 
    log($EVAL_ERROR); 
    handle_file_not_put(); 
} 

और फिर

sub put_a_file { 
    my ($ftp, $my_file) = @_; 
    $ftp->put($my_file) or die "Couldn't upload $my_file!"; 
    log("$my_file uploaded"); 

}

+0

सुनिश्चित करें कि आप '-no_match_vars' के साथ एक्समन की सलाह का पालन करें; विवरण के लिए http://perldoc.perl.org/English.html देखें। वैकल्पिक रूप से, आप $ EVAL_ERROR के लिए $ @ का उपयोग कर सकते हैं, लेकिन $ EVAL_ERROR को पढ़ने में आसान है। –

+0

धन्यवाद, रॉबर्ट, लेकिन मुझे लगता है कि हमारे फिक्स क्रैश हो गए हैं। :) – Axeman

1

उपयोग है।


sub test { 
    my $val = shift; 
    if($val != 2) { 
     return undef; 
    } 
    return 1; 
} 

test(3) || do { 
      print "another value was sent"; 
}; 
4

फोन या {करना}; हमेशा मेरे सिर को चोट पहुंचाता है। क्या "या" वाक्यविन्यास (जिसे मैं एक लाइनर के लिए बहुत उपयोग कर रहा हूं) बनाम "अगर" (जिसे मैं बहु लाइनर के लिए पसंद करता हूं) का उपयोग करने का कोई अच्छा कारण है?

तो, क्या इन तरीकों में से किसी एक की प्राथमिकता में उपयोग करने या उपयोग करने का कोई कारण नहीं है?

foo() 
    or do { 
    log($error); 
    return($error); 
    }; 
log($success); 

if (!foo()) { 
    log($error); 
    return($error); 
} 
log($success); 
+0

मैं तब तक उपयोग करूंगा जब तक (foo()) {if (! Foo()) के बजाय।मैं का उपयोग करें या {} कर जब समारोह कॉल DBI-> कनेक्ट ( 'dbi: foo: dbname = बार' की तरह कई लाइनों भर में फैला है, $ उपयोगकर्ता, $ गुजरती हैं, { AutoCommit => 0, चॉपब्लैंक्स => 1, } ) या { # हैंडल त्रुटि } –

+1

त्रुटि जांच के लिए "या करें" पोस्ट-स्टेटमेंट मेरा पसंदीदा तरीका है। यह वास्तविक क्रिया को लक्षित के रूप में प्रदर्शित करता है, और फिर त्रुटियों को संभालने के लिए कुछ अतिरिक्त जोड़ता है। "जब तक" (और "अगर") ने त्रुटि प्रबंधन पर बहुत अधिक जोर दिया, जैसे कि त्रुटि उत्पन्न करना _intended_ था। – Svante

+0

तो उत्तर ऐसा प्रतीत होते हैं क्योंकि एक तरीका अधिक समझ में आता है या बेहतर दिखता है (जब कार्रवाई कई लाइनों तक फैलती है तो मैं उपयोग करने या करने के बारे में बिंदु देखता हूं, लेकिन मैं "त्रुटि प्रबंधन पर बहुत अधिक जोर नहीं देता" तर्क नहीं खरीदता)। आखिरकार इन दोनों उत्तरों को सौंदर्यशास्त्र के साथ करना है और प्रदर्शन नहीं करना है ... – jj33

-1

मुझे समझ में मुश्किल हो रही है कि इसे एक काम में क्यों लपेटा जाना चाहिए। क्या कोई कारण है कि यह पर्याप्त नहीं है?

my $ftp_ok = $ftp->put($my_file) 
    or log("Couldn't upload $my_file") and return -1; 

log("$my_file uploaded") if $ftp_ok; 

यह मानता है कि पुट फ़ंक्शन हमेशा सफलता पर अनिश्चित नहीं होता है।

+1

समूह चीजों को एक और अधिक पठनीय तरीके से करें। बिना किसी कंस्ट्रैसिस या ब्लॉकों के सशर्त को स्ट्रिंग करना आपको रोकता है और पता चलता है कि क्या हो रहा है (और "हम्म, लॉग() लॉग इन कर सकते हैं?) – runrig

+0

यह मानता है कि लॉग() सही हो जाता है। बेहतर: या लॉग (" ... "), वापसी -1; – ysth

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

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