নেস্টেড ডেটা স্ট্রাকচার তৈরি করার সময় অসুবিধা


14

একটি এপিআই-এর জন্য একটি জেএসএন বার্তা তৈরি করার চেষ্টা করার সময়, আমি নিজেকে এমন কিছু করার জন্য সংগ্রাম করতে দেখলাম যা আমি সাধারণ বলে মনে করি। আমার নীচের মত একটি বার্তা তৈরি করা প্রয়োজন:

{ "list": [ { "foo": 1, "bar": 2 } ] }

তবে, আমার প্রথম প্রচেষ্টাটি কার্যকর হয়নি:

say to-json { foo => [ { a => 1, b => 2 } ] };
# {"foo":[{"a":1},{"b":2}]}

বিষয়গুলি আরও সরল করার চেষ্টা করে আমাকে আরও বিভ্রান্ত করে:

say { foo => [ { a => 1 } ] };
# {foo => [a => 1]}
# Note that this is not JSON, but I expected to see curly braces

তারপরে আমি কিছু অস্থায়ী পরিবর্তনগুলি ব্যবহার করার চেষ্টা করেছি এবং এটি কাজ করেছে:

my @list = { a => 1 };
say to-json { foo => @list };
# {"foo":[{"a":1}]}

my %hash = ( a => 1 );
say to-json { foo => [ %hash ] };
# {"foo":[{"a":1}]}

এখানে কি হচ্ছে?

একটি অতিরিক্ত অস্থায়ী পরিবর্তনশীল ছাড়াই আমি কীভাবে আমার পছন্দসই আউটপুট অর্জন করতে পারি?


1
say to-json { foo => [ { a => 1 } ] };কিছু আউটপুট করা উচিত {"foo":[{"a":1}]}, না {"foo":["a":1]}। পরেরটি টাইপো, তাই না? তা না হলে কী say $*PERL.compiler.version;বলে?
রায়ফ

হুঁ, হ্যাঁ, আপনি ঠিক বলেছেন। আমার ধারণা আমি যখন জিনিস বের করার চেষ্টা করতাম তখন জিনিসগুলি ভুলভাবে লিখতাম। এমনকি say to-json { foo => [ a => 1 ] }আউটপুটস {"foo":[{"a":1}]}তাই আমি কখন কী করেছি আমি যখন টাইপ করেছি তখন কে জানে। আমার খারাপ!
জেজে

উত্তর:


17

আপনি একক যুক্তির নিয়ম আবিষ্কার করেছেন । রাকুতে অসংখ্য নির্মাণ তাদের সরবরাহ করা যুক্তিকে পুনরাবৃত্তি করবে। এর মধ্যে [...]অ্যারে সুরকার অন্তর্ভুক্ত । এই কারণেই যখন আমরা বলি:

say [1..10];

আমরা একটি অ্যারে পাই যার মধ্যে 10 টি উপাদান রয়েছে, 1 টি নয়, তবে এর অর্থ এটিও রয়েছে:

say [[1,2]];

ইটারেটস করে [1,2]এবং এর ফলে ফলাফল হয় [1,2]- যেন অভ্যন্তরীণ অ্যারেটি সেখানে ছিল না। একটি Hashজোড়া এর পুনরাবৃত্তি, এইভাবে:

{ foo => [ { a => 1, b => 2 } ] }

প্রকৃতপক্ষে উত্পাদন:

{ foo => [ a => 1, b => 2 ] }

অর্থাৎ অ্যারেতে জোড়া রয়েছে। এরপরে JSON সিরিয়ালাইজার প্রতিটি জোড়কে এক-উপাদান উপাদান হিসাবে ক্রমিক করে তোলে।

সমাধানটি হ'ল একক উপাদানকে পুনরাবৃত্তিযোগ্য produce ইনফিক্স ,অপারেটর হ'ল তালিকা তৈরি করে, তাই আমরা এটি ব্যবহার করতে পারি:

say to-json { foo => [ { a => 1, b => 2 }, ] };
#                        note the , here ^

তারপরে পুনরাবৃত্তি হওয়া একক যুক্তি হ্যাশ সহ একটি 1-উপাদান তালিকা এবং আপনি যে ফলাফলটি চান তা পেয়ে যান।

এটি মনে রাখার সহজ উপায়: আপনি যদি কোনও একক পুনরাবৃত্তিকে নির্দিষ্ট করতে না চান তবে যদি কোনও তালিকা, অ্যারে বা হ্যাশ এমনকি একটি একক উপাদান তালিকার মান নির্দিষ্ট করে থাকে তবে সর্বদা ট্রিলিং কমা ব্যবহার করুন।


2
অন্য উপায়টি কোনও স্কেলারে আইটেমাইজ করা: {foo => [$ {a => 1, খ => 2}]}
জাকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.