2010-07-15 10 views
5

मैं स्थानीय प्रतियां बनाने के बिना हैश की एक सरणी के संदर्भ के माध्यम से पुनरावृत्ति करना चाहता हूं, लेकिन मुझे लगता है कि स्ट्रिंग ("1") का उपयोग ARRAY ref के रूप में नहीं कर सकता है जबकि "सख्त" refs "त्रुटियों। क्यूं कर? मैं इसे कैसे ठीक करूं?पर्ल में संदर्भ: हेशेस का एरे

sub hasGoodCar { 
    my @garage = (
       { 
       model => "BMW", 
       year => 1999 
       }, 

       { 
       model => "Mercedes", 
       year => 2000 
       }, 
       ); 

    run testDriveCars(\@garage); 
}  

sub testDriveCars { 
    my $garage = @_; 

    foreach my $car (@{$garage}) { # <=========== Can't use string ("1") as an ARRAY ref while "strict refs" error 
    return 1 if $car->{model} eq "BMW"; 
    } 
    return 0; 
} 

उत्तर

7

लाइन

my $garage = @_; 

गेराज @_ की लंबाई प्रदान करती है। testDriveCars विधि पर कॉल करने के लिए आप एक एकल तर्क पास करते हैं, इसलिए लंबाई एक है, इसलिए "1" के बारे में आपका त्रुटि संदेश।

आप

my ($garage) = @_; 

या शायद

my $garage = shift; 

बजाय लिख सकते हैं।

@garage के असाइनमेंट के बाद भी पोस्टिंग में एक लापता अर्धविराम है।

विवरण के लिए perldoc perlsub देखें।

+0

यह सामान्य त्रुटि संदर्भ को समझने से नहीं आती है। एक स्केलर के लिए असाइनमेंट एक स्केलर संदर्भ उत्पन्न करता है, इस प्रकार '_ _' को स्केलर के रूप में मूल्यांकन किया जाता है (जो लंबाई उत्पन्न करता है)। – daotoad