পারলে আমি কীভাবে হ্যাশগুলি একত্রিত করতে পারি?


95

উভয় হ্যাশকে% হ্যাশ 1 এর সাথে একত্রিত করার সর্বোত্তম উপায় কী? আমি সর্বদা জানি যে% হ্যাশ 2 এবং% হ্যাশ 1 এর সর্বদা অনন্য কী রয়েছে। আমি যদি সম্ভব হয় তবে একটি একক লাইনের কোডও পছন্দ করব।

$hash1{'1'} = 'red';
$hash1{'2'} = 'blue';
$hash2{'3'} = 'green';
$hash2{'4'} = 'yellow';

উত্তর:


168

দ্রুত উত্তর (টিএল; ডিআর)

    % হ্যাশ 1 = (% হ্যাশ 1,% হ্যাশ 2)

    ## অথবা ...

    @ হ্যাশ 1 {কীগুলি% হ্যাশ 2} = মানগুলি হ্যাশ 2;

    ## বা রেফারেন্স সহ ...

    $ hash_ref1 = {% $ hash_ref1,% $ hash_ref2};

ওভারভিউ

  • প্রসঙ্গ: পার্ল 5.x
  • সমস্যা: ব্যবহারকারী দুটি হ্যাশ 1 একটি একক ভেরিয়েবলের সাথে একীভূত করতে চায়

সমাধান

  • সাধারণ ভেরিয়েবলের জন্য উপরের সিনট্যাক্সটি ব্যবহার করুন
  • হ্যাশ :: জটিল নেস্টেড ভেরিয়েবলগুলির জন্য মার্জ করুন

বিপদ

আরো দেখুন


পাদটীকা

1 * (ওরফে এসোসিয়েটিভ-অ্যারে , ওরফে অভিধান )


4
হ্যাঁ, যদি কোনও কী সংঘর্ষ না হয়, @ হ্যাশ 1 {কীগুলি% হ্যাশ 2} = মান% হ্যাশ 2; আফিক, দ্রুত এবং সংক্ষিপ্ততম উপায় AI
Kixx

47
আপনি শুধু করতে পারেন না কেন%hash1 = (%hash1, %hash2)
ব্যবহারকারীর 102008

4
এটি রেফারেন্সগুলির সাথেও কাজ করে বলে মনে হচ্ছে: $ hash_ref1 = ($ hash_ref1, $ hash_ref2);
Lepe

4
এটি সেট $hash_ref1হবে $hash_ref2, কোনও মার্জ হবে না। আপনি চান $hash_ref1 = { %$hash_ref1, %$hash_ref2 };, আমি উত্তর সম্পাদনা করব।
এম সোমেরভিলে

39

পরীক্ষা করে দেখুন perlfaq4: আমি দুই হ্যাশ কীভাবে একত্রীকরণ । পার্ল ডকুমেন্টেশনে ইতিমধ্যে প্রচুর ভাল তথ্য রয়েছে এবং অন্য কারও উত্তর দেওয়ার অপেক্ষা না করে আপনি এখনই তা পেতে পারেন। :)


আপনি দুটি হ্যাশ একত্রীকরণের সিদ্ধান্ত নেওয়ার আগে, আপনাকে সিদ্ধান্ত নিতে হবে যদি উভয় হ্যাশগুলিতে কীগুলি একই থাকে এবং আপনি যদি মূল হ্যাশগুলি সেটির মতো ছেড়ে যেতে চান তবে কি করবেন।

আপনি যদি আসল হ্যাশগুলি সংরক্ষণ করতে চান তবে একটি হ্যাশ (% হ্যাশ 1) একটি নতুন হ্যাশ (% নতুন_হ্যাশ) এ অনুলিপি করুন, তারপরে অন্যান্য হ্যাশ (% হ্যাশ 2) থেকে নতুন হ্যাশগুলিতে কীগুলি যুক্ত করুন% কীটি ইতিমধ্যে% new_hash এ বিদ্যমান রয়েছে তা পরীক্ষা করে দেখুন সদৃশগুলির সাথে কী করবেন তা সিদ্ধান্ত নেওয়ার সুযোগ দেয়:

my %new_hash = %hash1; # make a copy; leave %hash1 alone

foreach my $key2 ( keys %hash2 )
    {
    if( exists $new_hash{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $new_hash{$key2} = $hash2{$key2};
        }
    }

আপনি যদি একটি নতুন হ্যাশ তৈরি করতে না চান তবে আপনি এখনও এই লুপিং কৌশলটি ব্যবহার করতে পারেন; কেবলমাত্র% নতুন_হ্যাশকে% হ্যাশ 1 এ পরিবর্তন করুন।

foreach my $key2 ( keys %hash2 )
    {
    if( exists $hash1{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $hash1{$key2} = $hash2{$key2};
        }
    }

যদি আপনার কোনও যত্ন নেই যে একটি হ্যাশ অন্য এবং কী থেকে মানগুলি ওভাররাইট করে, আপনি কেবল একটি হ্যাশ স্লাইস ব্যবহার করে অন্য একটি হ্যাশ যুক্ত করতে পারেন। এই ক্ষেত্রে,% হ্যাশ 2 থেকে প্রাপ্ত মানগুলি হ্যাশ 1 থেকে মানগুলি প্রতিস্থাপন করে যখন তাদের কীগুলিতে অভিন্ন থাকে:

@hash1{ keys %hash2 } = values %hash2;

পেরফাক এবং অন্যান্য প্রশ্নের অন্যান্য সংস্থানগুলিতে লিঙ্ক করতে ভাল লাগছে
ক্রিস

14

এটি একটি পুরানো প্রশ্ন, তবে 'পার্ল মার্জ হ্যাশ'-এর জন্য আমার গুগল অনুসন্ধানে উঠে এসেছে - এবং এখনও এটি খুব সহায়ক সিপিএএন মডিউলটির উল্লেখ করে না : মার্জ


এটি অন্তর্ভুক্ত করার জন্য শীর্ষ-ভোট প্রাপ্ত উত্তর আপডেট করা হয়েছে।
dreftymac

6

হ্যাশ রেফারেন্সের জন্য। নিম্নলিখিতগুলির মতো আপনার কোঁকড়ানো ধনুর্বন্ধনী ব্যবহার করা উচিত:

$hash_ref1 = {%$hash_ref1, %$hash_ref2};

এবং প্রথম বন্ধনী ব্যবহার করে প্রস্তাবিত উত্তর নয় :

$hash_ref1 = ($hash_ref1, $hash_ref2);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.