jq-তে নিচের সম্পর্কমূলক ও সমতা অপারেটরগুলো দিয়ে সংখ্যা তুলনা করা যায়।
| তুলনা | অপারেটর |
|---|---|
| এর চেয়ে বড় | a > b |
| এর চেয়ে বড় বা সমান | a >= b |
| এর চেয়ে ছোট | a < b |
| এর চেয়ে ছোট বা সমান | a <= b |
| সমান | a == b |
| অসমান | a != b |
তুলনার ফলাফল সবসময়ই একটি বুলিয়ান মান, অর্থাৎ হয় true নয়তো false।
1 < 3, # => true
2 != 2, # => false
1 == 1.0 # => true
# All numbers are floating-points, so this is different syntax
# for the exact same value.
উপরের তুলনা অপারেটরগুলো দিয়ে স্ট্রিংও তুলনা করা যায়। সেক্ষেত্রে অভিধানিক (লেক্সিকোগ্রাফিক্যাল) ক্রম প্রয়োগ করা হয়। ক্রমটি ইউনিকোড কোডপয়েন্ট মান অনুসারে।
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
দুটি ভ্যারিয়েবলের তুলনা করার সময় সাবধান থাকতে হবে, যেগুলো দেখতে সংখ্যাসূচক মান ধারণ করছে মনে হলেও আসলে স্ট্রিং টাইপের। অভিধানিক ক্রমের কারণে ফলাফল সংখ্যা টাইপের মানের তুলনার মতো হবে না।
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
jq-এর == অপারেটরটি Javascript-এর ===-এর মতো: যা দেখতে একই রকম মনে হয় কিন্তু ভিন্ন টাইপের, তা সমান নয়।
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
দুটি অ্যারে সমান হয় যদি তাদের সব সংশ্লিষ্ট এলিমেন্ট সমান হয়।
[1, 2, 3] == [1, 2, 3] # => true
[1, 2, 3] == [1, 3, 2] # => false, different order
[1, 2, 3] == [1, 2, "3"] # => false, different types
দুটি অবজেক্ট সমান হয় যদি তাদের একই কী (key)-ভ্যালু জোড়া থাকে।
{name: "Joe", age: 42} == {age: 42, name: "Joe"} # => true
{name: "Joe", age: 42} == {age: 42, name: "Jane"} # => false
{name: "Joe", age: 42} == {age: "42", name: "Joe"} # => false
{name: "Joe", age: 42} == {age: 42, name: "Joe", height: 175} # => false
# comparisons will drill down as deeply as required
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2]}}} # => true
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2, 3]}}} # => false
jq-এর শর্তাধীন এক্সপ্রেশন হলো if A then B else C end।
if-then-else হলো jq-এর অন্য সব বিল্ট-ইনের মতোই একটি ফিল্টার: এটি একটি ইনপুট নেয় এবং একটি আউটপুট তৈরি করে।
যদি A এক্সপ্রেশনটি একটি "ট্রুথি" মান তৈরি করে, তাহলে if ফিল্টার B ইভ্যালুয়েট করে।
নাহলে এটি C ইভ্যালুয়েট করে।
if ফিল্টারের ইনপুট B বা C-তে পাঠানো হয়।
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
else ক্লজটি ঐচ্ছিক; নিচের দুটি স্টেটমেন্ট সমতুল্য।
if A then B else . end
if A then B end
elif দিয়ে আরও শর্ত যোগ করা যায়।
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
যতগুলো দরকার ততগুলো elif ক্লজ ব্যবহার করুন।
jq-এ একমাত্র "false" মান হলো false আর null।
বাকি সবকিছুই "true", এমনকি শূন্য সংখ্যাটি, খালি স্ট্রিং, খালি অ্যারে আর খালি অবজেক্টও।
জটিল কোয়েরি তৈরি করতে বুলিয়ান অপারেটর and আর or ব্যবহার করা যায়।
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
নেগেট করতে not ব্যবহার করুন। এটি একটি ফিল্টার, অপারেটর নয়।
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
অল্টারনেটিভ অপারেটর দিয়ে কোনো এক্সপ্রেশন false বা null হলে একটি "ডিফল্ট" মান নির্দিষ্ট করা যায়।
A // B
# This is identical to
if A then A else B end
উদাহরণ হিসেবে
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
এই অনুশীলনীতে আপনি একটি যানবাহন কেনার প্রস্তুতি নিতে সাহায্য করার জন্য কিছু কোড লিখবেন।
আপনার তিনটি কাজ আছে: আপনার লাইসেন্সের প্রয়োজন হবে কি না তা নির্ধারণ করা; দুটি যানবাহনের মধ্যে বেছে নেওয়া; এবং একটি ব্যবহৃত যানবাহনের জন্য গ্রহণযোগ্য দাম অনুমান করা।
কিছু ধরনের যানবাহন চালানোর জন্য ড্রাইভার লাইসেন্স প্রয়োজন।
ধরে নিন শুধু "car" এবং "truck" ধরনের জন্য লাইসেন্স প্রয়োজন; বাকি সবকিছু লাইসেন্স ছাড়াই চালানো যায়।
needs_license ফাংশনটি বাস্তবায়ন করুন, যা যানবাহনের ধরন নেয় এবং সেই ধরনের যানবাহনের জন্য আপনার লাইসেন্স প্রয়োজন কি না তা নির্দিষ্ট করা একটি বুলিয়ান রিটার্ন করে।
"car" | needs_license
# => true
"bike" | needs_license
# => false
আপনি আপনার কাছে থাকা যানবাহনের বিকল্পগুলো মূল্যায়ন করেছেন।
আপনি তা দুটি বিকল্পে নামিয়ে আনতে পেরেছেন, কিন্তু চূড়ান্ত সিদ্ধান্ত নিতে আপনার সাহায্য দরকার।
choose_vehicle ফাংশনটি বাস্তবায়ন করুন, যা ইনপুট হিসেবে দুটি যানবাহনের একটি অ্যারে নেয় এবং একটি সিদ্ধান্ত রিটার্ন করে, যেটি অভিধানের ক্রমে প্রথমে আসা বিকল্প।
["Wuling Hongguang", "Toyota Corolla"] | choose_vehicle
# => "Toyota Corolla is clearly the better choice."
["Volkswagen Beetle", "Volkswagen Golf"] | choose_vehicle
# => "Volkswagen Beetle is clearly the better choice."
এখন যেহেতু আপনি সিদ্ধান্ত নিয়ে ফেলেছেন, আপনি ডিলারশিপে ন্যায্য দাম পাচ্ছেন কি না তা নিশ্চিত করতে চান। যেহেতু আপনি একটি ব্যবহৃত যানবাহন কিনতে আগ্রহী, দাম নির্ভর করে যানবাহনটির বয়স কত তাের উপর। মোটামুটি অনুমানের জন্য ধরে নিন, যানবাহনটির বয়স যদি ৩ বছরের কম হয়, তাহলে এর দাম একেবারে নতুন অবস্থায় থাকা মূল দামের ৮০%। যদি বয়স ১০ বছরের বেশি হয়, তাহলে ৫০%। যদি যানবাহনটির বয়স অন্তত ৩ বছর কিন্তু ১০ বছরের বেশি না হয়, তাহলে মূল দামের ৭০%।
resell_price ফাংশনটি বাস্তবায়ন করুন, যা if, elif এবং else ব্যবহার করে এই যুক্তি প্রয়োগ করে।
এটি মূল দাম ও যানবাহনের বয়স ধারণ করা একটি অবজেক্ট নেয় এবং ডিলারশিপে আনুমানিক দাম রিটার্ন করে।
{"original_price": 1000, "age": 1} | resell_price
# => 800
{"original_price": 1000, "age": 5} | resell_price
# => 700
{"original_price": 1000, "age": 15} | resell_price
# => 500
Exercism-এ সাইন আপ করুন, jq ট্র্যাকের 12টি কনসেপ্ট75টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।