याद कीजिए कि एक 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]
वेरिएबल के नाम को ऑब्जेक्ट की से मिलाने पर एक शॉर्टकट मिल जाता है:
{"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 को दिया जाता है (add सभी एलिमेंट पर + ऑपरेटर लगाकर संख्याओं का जोड़ निकालता है)[2,4,8,7] length को भी दिया जाता हैjq ऑपरेटर//
a // b एक्सप्रेशन b देता है जब a false या null हो, वरना यह a देता है।
वेरिएबल सेट करते समय यह डिफॉल्ट वैल्यू देने के लिए बहुत काम का है:
(.input.theAnswer // 42) as $answer | ...
+, -, * संख्याओं के जोड़, घटाव और गुणा के सामान्य ऑपरेटर हैं।इस अभ्यास में आप कुछ कोड लिखेंगे, जिससे अपनी पसंदीदा रेसिपी की किताब से एक शानदार लसैगना बनाने में आपको मदद मिलेगी।
आपके सामने चार काम हैं, और सब लसैगना पकाने में लगने वाले समय से जुड़े हैं।
$expected_minutes_in_oven नाम का एक कॉन्स्टेंट बनाइए।
रेसिपी की किताब के अनुसार, ओवन में लगने वाला अपेक्षित समय 40 मिनट है:
$ 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,
...
तैयारी का समय यह बताता है कि लसैगना को ओवन में रखने से पहले तैयार करने में कितना समय लगता है। हर परत तैयार करने में 2 मिनट लगते हैं।
$ 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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।