2011-08-11 14 views
21

अगर मैं एक हैशहैश में केवल एक कुंजी के साथ मुख्य नाम खोजें?

my %h = (
    secret => 1; 
); 

है और मुझे पता है कि केवल है हैश में एक महत्वपूर्ण है, लेकिन मैं नहीं जानता कि यह क्या कहा जाता है।

मैं तो उस हैश

my $key; 
foreach my $i (keys %h) { 
    $key = $h{$i}; 
} 

के माध्यम से पुनरावृति करने के लिए है या वहां कुंजी का नाम पाने के लिए एक बेहतर तरीका है क्या?

+0

अब तक दिए गए सभी उत्तरों (स्वीकार्य सहित) से एक [बहुत आसान समाधान] (http://stackoverflow.com/a/42809337/2932052) है। यह समझने और याद रखने के लिए भी छोटा और आसान है। – Wolf

उत्तर

34

एक list slice तो बस उस सूची के पहले तत्व निकालने यह

(keys %h)[0] 

keys सूची लौटाता करना चाहिए,।

+7

इस विधि के साथ देखने के लिए एकमात्र चीज "फ़ंक्शन की तरह दिखती है" समस्या है। इससे बचने के लिए आपको '((कुंजी% एच) [0]) की आवश्यकता हो सकती है 'उदाहरण के लिए' perl -E 'मेरा% h = (secret => 1); कहें (कुंजी% एच) [0]; '' विफल रहता है लेकिन 'perl -E' मेरा% h = (secret => 1); कहें ((कुंजी% एच) [0]); '' काम करता है। समस्या यह है कि पर्ल 'कहते हैं' और '() 'और इसलिए पार्स को' (कहते हैं (कुंजी% एच)) [0]'। तो बस सावधान रहें। –

+4

कोई सरणी वापस नहीं आ रही है या संदर्भों को संदर्भित नहीं किया जा रहा है। प्रासंगिक दस्तावेज़ों के लिए शब्दावली और जोड़ा लिंक फिक्स्ड। – ikegami

6
my @keys = keys %h; 
my $key = $keys[0]; 
8

मुझे विश्वास नहीं है कि keys फ़ंक्शन का उपयोग करना आवश्यक है।

my ($key) = %h; 

या

my $key = (%h)[0]; 

हैश कोष्ठक के अंदर एक सूची में विस्तार किया जाएगा, तो हम बस उस सूची है, जो महत्वपूर्ण है के पहले तत्व ले सकते हैं।

+1

मैं मानता हूं कि यह काम करेगा। मुझे लगता है कि यह "बहुत चालाक-आधा" का एक उदाहरण है जो पर्ल को एक बुरा नाम देता है। –

+0

क्या आपको लगता है कि यह आधे से बहुत चालाक है? – TLP

+0

तो मेरा पूरा ($ x) =% h' बहुत चालाक है? –

4

[ keys %h ]->[0] पहले की टिप्पणी में Joel उल्लेख विसंगति भी करेगा। यह कोड गंध करता है जैसे कि यह समस्याएं पैदा करेगा। यदि वास्तव में केवल एक ही कुंजी/मूल्य जोड़ी है, तो डेटा को संभालने का एक बेहतर तरीका हो सकता है।

कम से कम, मैं यह सुनिश्चित करने के लिए जांच करता हूं कि उम्मीद कभी चुपचाप उल्लंघन नहीं करती है। जैसे ‐

keys %h == 1 or die "ETOOMANYKEYS"; 
print [ keys %h ]->[0], $/; 
2
my $k = each %h; 

हालांकि, अगर आप इटरेटर पुनर्स्थापित करने के लिए याद करता है, तो आप कभी भी यह एक ही हैश पर फिर से उपयोग करना चाहते हैं चाहिए। या तो कोई अन्य each ऐसा करेगा, या keys होगा, और यदि स्केलर संदर्भ में उपयोग किया जाता है, तो सूची बनाने से बचें। तो तुम

scalar keys %h; 
# OR 
each %h;   # <- gets the undef 
my $k2 = each %h; # <- gets the first key 

तो उसे रीसेट कर सकते हैं आप इसे इस प्रकार कर सकता है:

my $k = (scalar keys %h, each %h); 

लेकिन JSON संदेशों और सामान जहां सिर्फ एक बार हैश और फेंक में है पढ़ना चाहते हैं पढ़ने की तरह यह मानते हुए इसे दूर, शायद यह सबसे संक्षिप्त है। हालांकि, अगर आप चर शीघ्र चाहते हैं, यह शायद आसान यह करने के लिए है:

my ($k, $v) = each %$simple_JSON_structure; 
+1

शून्य संदर्भ में कुंजी भी काम करता है (और एक बंधे हैश के लिए अधिक कुशल होगा) – ysth

+0

[लेकिन बाद में चाबियाँ (% हैश) का उपयोग करके पुनरावर्तक को रीसेट करना न भूलें या बाद में प्रत्येक विफल हो जाएगा।] (Https: // stackoverflow। com/पदों/42809852/संशोधन) – Wolf

12
my ($key) = keys %h; 

आप असाइनमेंट ऑपरेटर के दोनों किनारों पर सूची संदर्भ का उपयोग कर रहे हैं, कुंजी सूची में पहला आइटम हो जाता है $ कुंजी को सौंपा गया।

1

आइए पर

my ($key) = %h; 

Hashes एक नज़र है और सरणियों के रूप में विभिन्न वे लग रहे हैं के रूप में नहीं कर रहे हैं। वे दोनों सूचियों से बारीकी से संबंधित हैं। सूचियों का उपयोग करना सामान्य रूप से शुरू किया गया तरीका है, और => अधिकतर , के लिए एक उपनाम है जिसमें यह केवल बाएं ऑपरेंड का इलाज करता है, जिसका अर्थ स्पष्ट रूप से उद्धृत किया गया है। पर्ल बंद हो जाता है केवल यदि आप, अपने सही संकार्य के उद्धरण भूल तो निम्न दोनों लाइनों को स्वीकार किया जाएगा:

my %h = (a=>b=>c=>'d'); 
my @a = (a=>b=>c=>'d'); 

ठीक है, आप कभी भी इस कोशिश की थी?

my %h = ('key'); 

... या इस:

my @a = ('value'); 
my %h = @a; 

हैश ऊपर थोड़ा अजीब लग सकता है, लेकिन यह मूल्य undef साथ सिर्फ एक कुंजी है।

क्योंकि यह सबसे अधिक संभावना है कि आप कैसे एकल मान का उपयोग करने के लिए कहेगा, मैं का उपयोग करने का सुझाव देते हैं:

my ($key, $value) = %h; 

... या और भी आसान:

my ($key) = %h; 

है यही कारण है कि हमने शुरू ।

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