2011-06-16 4 views
8

मैंने अभी मूस के साथ काम करना शुरू कर दिया है और एक अजीब समस्या में भाग लिया है जिसे मैं समझ नहीं सकता। निम्नलिखित कोड:मूस के साथ अजीब व्यवहार, कोशिश करें :: छोटा, और TryCatch

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Try::Tiny; 

{ 
    package Foo; 
    use Moose; 
    has x => (is => 'ro', isa => 'Int'); 
} 

my $f; 
try { 
    $f = Foo->new(x => 'x'); 
} catch { 
    die "oops\n"; 
} 
print $f->x . "\n"; 

पैदा करता है:

Can't call method "x" on an undefined value at m2.pl line 19. 

हालांकि, अगर मैं TryCatch साथ Try::Tiny की जगह है, यह काम करता है के रूप में मैं यह मान लेगा यह होना चाहिए:

oops 

यहां तक ​​कि अगर x है सही मान, 5 कहें, Try::Tiny अभी भी undefined value त्रुटि उत्पन्न करता है।

जैसा कि मूस प्रलेखन के सभी पढ़ रहे हैं, मैं Try::Tiny का उपयोग कर रहा हूं, मैं इस बात पर बहुत उलझन में हूं कि यह कोड क्यों काम नहीं कर रहा है। क्या मैं यहाँ कुछ पूरी तरह से गलत कर रहा हूँ? - try और catch दोनों ही कार्यों रहे

try { 
    $f = Foo->new(x => 'x'); 
} catch { 
    die "oops\n"; 
}; 

यह की Try::Tiny कार्यान्वयन की वजह से है:

उत्तर

16

Try::Tiny आज़माएं/कैच छंद के अंत में एक अर्धविराम की आवश्यकता है।

+0

गाह, एक शर्मनाक अनदेखी। धन्यवाद! – Joe

+2

+1 * stanza * के भयानक उपयोग के लिए। – FMc

4

कोशिश करें {...} पकड़ {...} एक अंतर्निहित नहीं है (क्योंकि यह एक मॉड्यूल द्वारा प्रदान किया जाता है)। पर्ल 5 में इसका मतलब है आप तो जैसे अर्धविराम से इसे समाप्त करने के लिए है कि:

try { 
    $f = Foo->new(x => 'x'); 
} catch { 
    die "oops\n"; 
}; 
print $f->x . "\n"; 

मैं उत्तर नहीं दे सकता कैसे TryCatch लापता अर्धविराम संभाल करने में सफल हुआ - लेकिन यह विभिन्न काला जादू :)

का उपयोग कर के लिए संभव है
+8

TryCatch Devel :: पार्सर को संशोधित करने की घोषणा करता है। यह प्रोटोटाइप और अज्ञात सब के रचनात्मक उपयोग के आधार पर प्रयास/पकड़ ब्लॉक के लिए प्रभावी ढंग से नए पार्सिंग नियम बनाता है। – perigrin

+1

डेवेल :: घोषित करें कि "बहुत अधिक जादू" समस्या से संबंधित कुछ विवाद इस बात से संबंधित हैं: http://www.perlmonks.org/?node_id=832796 – daotoad