कैसे पारित करने के लिए एक हैश पर्ल में

कार्य । में कोड की पर्ल कार्यक्रम, वहाँ है एक हैश %h. इस हैश वहाँ कुछ जोड़े के मूल्यों. आप की जरूरत करने के लिए जाने के माध्यम से सभी हैश वस्तुओं और क्रियाओं के साथ प्रत्येक आइटम.

के माध्यम से चलने के हैश का उपयोग कर foreach

सबसे अधिक बार, सबसे सुविधाजनक तरीका बायपास करने के लिए हैश का उपयोग करने के लिए foreach. यहाँ है एक उदाहरण कोड:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

foreach my $key (keys %h) {
    print "$key - $h{$key}\n";
}

यह सब काफी सरल है । पहले हम बनाने के लिए एक हैश %h है जो तीन जोड़े के मूल्यों. अगले एक चक्र है । का उपयोग कर keys %h हम प्राप्त की एक सूची के सभी हैश कुंजी (इस उदाहरण में, लाइन 'a', 'b' और 'asdf'). कुंजी स्ट्रिंग में लिखा है, एक चर $key , और कार्यान्वित पाश शरीर में तो, $key के लिए फिट बैठता है निम्न हैश कुंजी और फिर कार्यान्वित पाश शरीर, और ऐसा होता है के लिए सभी चाबियाँ.

अगर आप को बचाने के लिए इस कोड के लिए एक फ़ाइल script.pl और इसे चलाने के लिए perl script.pl, तो स्क्रीन दिखाई देगा का एक सेट के जोड़े मूल्यों में निहित हैश:

b - 20
asdf - Hello
a - 1

एक हैश है एक unordered सेट मूल्यों की है. और निष्कर्ष स्पष्ट रूप से दिखाई देता है — जिस क्रम में इसे वापस ले लिया था तत्वों के हैश से मेल नहीं खाता जिस क्रम में वे कार्यक्रम में परिभाषित किया गया कोड. और अगर आप को चलाने यह स्क्रिप्ट कई बार, क्रम में तत्वों के उत्पादन में बदल जाएगा । keys %h रिटर्न कुंजियों की सूची हैश एक मनमाना क्रम में. अगर आप की जरूरत करने के लिए आदेश हमेशा एक ही है, उदाहरण के लिए, आप उपयोग कर सकते हैं छँटाई foreach my $key (sort keys %h) {.

पास हैश का उपयोग कर while और each

एक और तरीका नाकाम करने के लिए पूरे हैश का उपयोग करने के लिए एक पाश while और कुंजी शब्द each. यहाँ कोड है जो काम करता है के लिए इसी तरह पिछले उदाहरण:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

while (my ($key, $value) = each %h) {
    print "$key - $value\n";
}

each %h रिटर्न की एक सूची में दो तत्वों — एक हैश कुंजी और अपनी इसी मूल्य है । बिल्कुल उसी के रूप में मामले में keys के क्रम में जो each रिटर्न जोड़े के मूल्यों से परिभाषित नहीं है. विभिन्न चलाता है की एक ही कार्यक्रम में वापसी करेंगे जोड़े में अलग-अलग आदेश ।

हम असाइन जो मूल्यों को लौट रहे हैं each में चर. each याद करते हैं जो जोड़े के हैश वह दिया गया था अगली बार जब आप का उपयोग एक अलग मूल्य जोड़े. जब तक यह जारी रहेगा each वापस नहीं करता है सब को जोड़े, तो यह वापस आ जाएगा, एक खाली सूची. जबकि each रिटर्न की एक जोड़ी मूल्यों, कार्यान्वित शरीर के while चक्र, एक बार यह एक खाली सूची देता है चक्र whileपूरा हो गया है ।

मूल्यों को बदलने में हैश

जब का उपयोग कर foreach चक्र keys %h मार डाला है केवल एक बार. जब का उपयोग कर whileचक्र each पर किया जाता है प्रत्येक यात्रा.

का विस्तार पिछले समस्या हम की जरूरत है न केवल प्रदर्शित करने के लिए तत्वों के सभी के लिए हैश, लेकिन यह भी उन्हें बदलने के लिए । यह पूरी तरह से कोई समस्या नहीं है जब का उपयोग कर foreach और keys:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

foreach my $key (keys %h) {
    print "$key - $h{$key}\n";
    $h{ $key . $key } = $h{$key};
    delete $h{$key};
}

print Dumper \%h;

के उत्पादन कार्यक्रम:

asdf - Hello
a - 1
b - 20
$VAR1 = {
          'bb' => 20,
          'aa' => 1,
          'asdfasdf' => 'Hello'
        };

यह काम नहीं करता है बनाने के लिए जब का उपयोग करने के लिए each:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my %h = (
    a => 1,
    b => 20,
    asdf => 'Hello',
);

while (my ($key, $value) = each %h) {
    print "$key - $value\n";

    # error!
    $h{ $key . $key } = $value;
    delete $h{$key};
}

print Dumper \%h;

जब आप इस कार्यक्रम चलाने के लिए स्क्रीन पर दिखाई देगा की तरह कुछ:

Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior at script.pl line 11.
b - 20
bb - 20
bbbb - 20
asdf - Hello
$VAR1 = {
          'asdfasdf' => 'Hello',
          'bbbbbbbb' => 20,
          'a' => 1
        };

each लौटे मूल्य जोड़ी से हैश, और फिर हम बदलने हैश. निम्नलिखित यात्रा के पाश और eachरिटर्न के एक जोड़े को संशोधित हैश, और यह वापसी कर सकते हैं जोड़ी है कि आप सिर्फ जोड़ा गया.

तो अगर बाईपास हैश की जरूरत है इसे बदलने के लिए, आप की जरूरत है का उपयोग करने के लिए foreach और keys. का उपयोग करते समय while और each कार्यक्रम ठीक से काम नहीं करेगा.

संबंधित विषयों

अन्य लेख