2010-05-15 9 views
8

मैं एक पर्ल कोड को डिक्रिप्ट करने का प्रयास कर रहा हूं जिसे मैं परिचित नहीं हूं, किसी भी तरह हैशरफ से संबंधित है। मैं अमेज़ॅन :: एस 3 का उपयोग कर रहा हूं, लेकिन मेरा प्रश्न एक सामान्य पर्ल प्रश्न है।इसका मतलब क्या है जब एक पर्ल विधि "हैशफ" लौटाती है?

use Amazon::S3; 
my $s3 = Amazon::S3->new(...); 
my $response = $s3->buckets; 

प्रलेखन (यहाँ) sais, s3- के बारे में> बाल्टी: नीचे कोड देखें

Returns undef on error, else HASHREF of results 

निम्न पंक्ति मेरे लिए काम कर रहा है, लेकिन मुझे समझ नहीं आता क्यों:

for $b in (@ { $response->{buckets} }) { 
    print "bucket: " . $b->bucket . "\n"; 
} 

मैं प्रत्येक ऑपरेटर द्वारा पहली पंक्ति पर परेशान हूं।

वास्तव में $response, $respone->{bucket} क्या प्रकार हैं। लगता है कि for के भीतर अभिव्यक्ति एक सरणी है, लेकिन मुझे यह वाक्यविन्यास नहीं समझा है: @{ ... }?

उत्तर

10

चलो इसे टुकड़ा-टुकड़ा से गुजरें।

$s3 आपकी एस 3 वस्तु है। $s3->buckets उस ऑब्जेक्ट पर buckets विधि कॉल करता है, और हम परिणाम $response पर संग्रहीत करते हैं। जैसा कि दस्तावेज़ कहते हैं, परिणाम एक हैश संदर्भ हैं; एक संदर्भ एक स्केलर है जो किसी अन्य मूल्य को इंगित करता है। यदि आप पॉइंटर्स से परिचित हैं, तो विचार वही है।

यदि हमारे पास सादा हैश %response था, तो हम $response{buckets} कहकर हैश में buckets कुंजी प्राप्त कर सकते हैं। चूंकि हमारे पास हैश संदर्भ है, इसलिए हमें कुंजी प्राप्त करने के लिए dereference ऑपरेटर (->) का उपयोग करना होगा, ताकि $response->{buckets} बन जाए।

लेकिन हम अभी तक नहीं किए गए हैं। $response->{buckets}खुद एक संदर्भ है, इस मामले में एक सरणी संदर्भ। यहां हम डेफरेंसिंग का एक और रूप देखते हैं। हम कर सकते हैं, अगर हम संदर्भित सरणी में केवल एक आइटम प्राप्त करना चाहते हैं, उदाहरण के लिए $response->{buckets}[0] कहें।लेकिन हम पूरी सूची चाहते हैं, इसलिए हम पूरे सरणी को कम करने के लिए @ ऑपरेटर का उपयोग करते हैं। चूंकि हमारे सरणी संदर्भ एक जटिल संरचना में निहित है, इसलिए हम अभिव्यक्ति को शामिल करने के लिए कर्ली का उपयोग करते हैं जिसमें संदर्भ है। तो @{ $response->{buckets} } हमें सरणी प्राप्त करता है।

यह एक ही कथन में बहुत कुछ कर रहा है।

संदर्भों पर अधिक जानकारी के लिए

, पर्ल में जानने के लिए, निम्न trickiest विषयों में से एक हो सकता है, जो:

  • perlreftut - पर्ल संदर्भ ट्यूटोरियल
  • perldsc - पर्ल डाटा संरचनाओं रसोई की किताब
  • perllol - सरणी के सरणी के बारे में सभी
  • perlref - मुख्य पर्ल संदर्भ दस्तावेज
+0

बहुत धन्यवाद। बहुत उपयोगी। – Uri

+0

perlreftut perlreftut perlreftut :) – hobbs

-1

आप रेफरी() फ़ंक्शन के साथ एक चर के प्रकार की जांच कर सकते हैं।

@ {...} का अर्थ है "डी-रेफरेंस स्केलर ... सरणी के रूप में"। तो यदि आप इस तरह जाते हैं: मेरा $ aref = ['a', 'b']; @ {$ aref} तक पहुंचने से सरणी ('ए', 'बी') उत्पन्न होगी।

इसी प्रकार हैश-संदर्भों के लिए% {...}।

अधिक जानकारी के लिए perlreftut देखें।

4

पर्ल संदर्भों की दुनिया में आपका स्वागत है! आपको reference tutorial बहुत आसान लगता है।

सिंटैक्स @{...} एक स्केलर मान लेता है और इसे किसी सरणी में डी-रेफरेंस करने का प्रयास करता है। %{...} भी है, जो हैश में डी-रेफरेंस करने का प्रयास करता है। कर्ली वैकल्पिक हैं, इसलिए आप एक ही प्रभाव प्राप्त करने के लिए @$reference या %$reference भी लिख सकते हैं। कुछ लोग उन्हें दृष्टिहीन रूप से उपयोगी पाते हैं जब संदर्भ हैश या सरणी के अंदर होता है, जैसा मामला है।

डेटा संरचना को थोड़ा और समझने में आपकी सहायता के लिए, डेटा :: डूपर जैसे कुछ का उपयोग करने का प्रयास करें।

use Data::Dumper; 
print Dumper $response; 
print Dumper $response->{buckets}; 
# The docs say that buckets is a hashref. It also happens that 
# you can coerce a hash into an array. Let's treat it as a hash 
# and see what's inside it, manually. The Dumper call above should 
# have already provided the structure to you, though. 
foreach my $k (keys %{$response->{buckets}}) { 
    print "$k => " . Dumper $response->{buckets}->{$k} 
} 
संबंधित मुद्दे