2012-01-16 19 views
6

नीचे दिए गए कोड के साथ क्या गलत है? जब चलाने के लिए, मैं: "संयोजन या स्ट्रिंग में अप्रारंभीकृत मूल्य का प्रयोग ./main.pl लाइन 14 पर (।)"मूस डिफ़ॉल्ट मानों के अंदर localtime का उपयोग कर

#!/usr/bin/perl 

package Test; 

use Moose; 

has 'message'  => (isa => 'HashRef', is => 'ro', default => sub{{(localtime)[2] => {(localtime)[3] => "hello"}}}); 

# the one below works fine 
#has 'message'  => (isa => 'HashRef', is => 'ro', default => sub{{"18" => {"16" => "hello"}}}); 

sub show { 
    my $self = shift; 
    print("Test: " . $self->message->{(localtime)[2]}->{(localtime)[3]} . "\n"); 
} 

my $o = Test->new(); 
$o->show(); 

मैं स्थानीयसमय (उपयोग नहीं करते हैं) तो यह ठीक काम करता है। इसके अलावा लोकलटाइम [2] और [3] अक्सर नहीं बदलते हैं (2 घंटे, 3 महीने का दिन है) तो समस्या यह नहीं है। अगर मैं एक डिबगर के साथ स्क्रिप्ट चलाने, मैं मिलता है:

x $self 
0 Test=HASH(0x3597300) 
    'message' => HASH(0x3597618) 
     16 => 'hello' 

तो यह है कि मैं 'खो' अविवेक से एक स्तर लग रहा है, वास्तव में यकीन नहीं क्यों ... किसी भी विचार?

उत्तर

10

बाहरी {} हैशफ के रूप में पार्स न करें। एक स्पष्ट return जोड़ें:

has 'message'  => (isa => 'HashRef', is => 'ro', default => sub{ return {(localtime)[2] => {(localtime)[3] => "hello"}} }); 

एक +, इस काम करता है के लिए मजबूर करने भी।

has 'message'  => (isa => 'HashRef', is => 'ro', default => sub{ +{(localtime)[2] => {(localtime)[3] => "hello"}} }); 
+0

वर्क्स ठीक है, धन्यवाद – mbonnin

+0

बस मेरी समझ के लिए: क्या बाहरी {} इस मामले में के रूप में पार्स करता है? क्या यह सिर्फ अनदेखा है? – mbonnin

+0

ठीक है, समझ गया, यह प्रश्न इसका उत्तर देता है: http://stackoverflow.com/questions/1617546/whats-the-history-of-the-in-front-of-a-hashref-that-disambiguates-from-a- कोड फिर से धन्यवाद। – mbonnin

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