মনে করুন, একটি jq প্রোগ্রাম হলো এক্সপ্রেশনের একটি পাইপলাইন।
ভ্যারিয়েবল অ্যাসাইনমেন্ট এই নিয়মটি মেনে চলে: একটি ভ্যারিয়েবল অ্যাসাইনমেন্ট হলো এমন একটি এক্সপ্রেশন, যা দেখতে এরকম:
... | expr as $varname | ...
আইডেন্টিটি এক্সপ্রেশন .-এর মতোই, ভ্যারিয়েবল অ্যাসাইনমেন্ট-এর আউটপুটও তার ইনপুটের মতোই।
ভ্যারিয়েবলের মান সেট করা একটি সাইড-এফেক্ট মাত্র।
উদাহরণ, যা দেখায় যে অ্যাসাইনমেন্টের পরে . শুরুর ইনপুটের মতোই থাকে:
$ jq -c -n '42 | (. * 2) as $double | [., $double]'
[42,84]
ভ্যারিয়েবলের স্কোপ "লেক্সিকাল", অর্থাৎ পাইপলাইনের বাকি অংশজুড়ে ভ্যারিয়েবলটি স্কোপে থাকবে। ফাংশনের ভেতরে ডিফাইন করা ভ্যারিয়েবল (ফাংশন নিয়ে আমরা পরে আলোচনা করব) ফাংশনের কাছে "লোকাল"।
ভ্যারিয়েবলের নাম অবশ্যই $ দিয়ে শুরু হতে হবে।
নামের বাকি অংশটি একটি আইডেন্টিফায়ার: একটি অক্ষর বা আন্ডারস্কোর দিয়ে শুরু হয়, তারপর আসে অক্ষর, সংখ্যা বা আন্ডারস্কোর।
ম্যানুয়াল থেকে:
একটিমাত্র
asএক্সপ্রেশন ব্যবহার করে একাধিক ভ্যারিয়েবল ঘোষণা করা যায়, যদি এমন একটি প্যাটার্ন দেওয়া হয় যা ইনপুটের গঠনের সঙ্গে মেলে (একে বলা হয় "ডিস্ট্রাকচারিং")।
উদাহরণ:
[1, 2, 3] as [$a, $b, $c]
| [$a, $b, $c] # => [1, 2, 3]
{"foo": "bar", "len": [10, 20]} as {foo: $f, len: [$h, $w]}
| [$f, $h, $w] # => ["bar", 10, 20]
ভ্যারিয়েবলের নাম অবজেক্ট কী (key)-এর সঙ্গে মিলিয়ে দিলে একটি শর্টকাট পাওয়া যায়:
{"x": 4, "y": 7} as {$x, $y}
| [$x, $y] # => [4, 7]
{"foo": "bar", "len": [10, 20]} as {$foo, $len}
| [$foo, $len] # => ["bar", [10, 20]]
একই শর্টকাটটি অবজেক্ট তৈরি-র ক্ষেত্রে উল্টো দিকেও কাজ করে
4 as $x | 7 as $y | {$x, $y} # => {"x":4, "y": 7}
উপরের উদাহরণেই দেখা গেছে, কনস্ট্যান্ট সংরক্ষণ করার জন্য ভ্যারিয়েবল সুবিধাজনক। কোডে "ম্যাজিক নাম্বার" দেখানোর চেয়ে কনস্ট্যান্টকে একটি নাম দেওয়া ভালো।
অনেক সময়ই ভ্যারিয়েবল বাদ দিলে কোড পড়তে আরও সহজ হয়।
সংখ্যার একটি তালিকার গড় নির্ণয় করার কথা ভাবুন
[2, 4, 8, 7]
| add as $sum
| length as $len
| $sum / $len
এর তুলনায়
[2, 4, 8, 7] | add / length
এটি jq-এর সবচেয়ে শক্তিশালী দিকগুলোর একটি তুলে ধরে: একটি ফিল্টারের ইনপুট প্রতিটি সাব-এক্সপ্রেশনকে দেওয়া হয়:
[2,4,8,7] পাঠানো হয় add-এ (যা সব এলিমেন্টে + অপারেটর প্রয়োগ করে সংখ্যাগুলো যোগ করে)[2,4,8,7] পাঠানো হয় length-এওjq অপারেটরগুলো আপনার দরকার হবে//
a // b এক্সপ্রেশনটি a যদি ফলস বা null হয় তাহলে b আউটপুট করে, অন্যথায় a আউটপুট করে।
ভ্যারিয়েবল সেট করার সময় একটি ডিফল্ট মান দেওয়ার জন্য এটি খুবই সুবিধাজনক:
(.input.theAnswer // 42) as $answer | ...
+, -, * হলো স্বাভাবিক সংখ্যাগত যোগ, বিয়োগ ও গুণের অপারেটর।এই অনুশীলনীতে আপনি কিছু কোড লিখবেন, যা আপনার প্রিয় রান্নার বই থেকে একটি দুর্দান্ত লাসাগনা বানাতে সাহায্য করবে।
আপনার সামনে চারটি কাজ আছে, সবগুলোই লাসাগনা রান্নায় ব্যয় হওয়া সময়ের সাথে সম্পর্কিত।
$expected_minutes_in_oven নামে একটি কনস্ট্যান্ট ডিফাইন করুন।
রান্নার বই অনুযায়ী, ওভেনে রাখার প্রত্যাশিত সময় মিনিটে ৪০:
$ jq -n -f lasagna.jq
{
"expected_minutes_in_oven": 40,
...
এই মানটি ইনপুট হিসেবে নেয় লাসাগনা ওভেনে কত মিনিট ছিল, আর আগের কাজে পাওয়া মিনিটে প্রত্যাশিত ওভেন সময়ের ভিত্তিতে রিটার্ন করে লাসাগনাকে ওভেনে আরও কত মিনিট থাকতে হবে।
$ echo '{"actual_minutes_in_oven": 18}' | jq -f lasagna.jq
{
"expected_minutes_in_oven": 40,
"remaining_minutes_in_oven": 22,
...
প্রস্তুতির সময় হলো লাসাগনা ওভেনে দেওয়ার আগে সেটি তৈরি করতে যত সময় লাগে। প্রতিটি স্তর প্রস্তুত করতে ২ মিনিট লাগে।
$ echo '{"number_of_layers": 3}' | jq -f lasagna.jq
{
...
"preparation_time": 6,
...
লাসাগনা রান্না করতে আপনি মোট কত মিনিট কাজ করেছেন, তা হিসাব করুন। এটি হলো মিনিটে প্রস্তুতির সময় এবং এই মুহূর্তে লাসাগনা ওভেনে যত মিনিট কাটিয়েছে তার যোগফল।
$ echo '{"actual_minutes_in_oven": 10, "number_of_layers": 2}' | jq -f lasagna.jq
{
...
"total_time": 14,
...
Exercism-এ সাইন আপ করুন, jq ট্র্যাকের 12টি কনসেপ্ট75টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।