ट्रैक
/
jq
jq
/
अभ्यास
/
लसाग्ना
लसाग्ना

लसाग्ना

सीखने का अभ्यास

परिचय

वेरिएबल

याद कीजिए कि एक 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]]
Note

यही शॉर्टकट ऑब्जेक्ट कंस्ट्रक्शन के लिए उलटी दिशा में भी काम करता है।

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 | ...
अंकगणितीय ऑपरेटर
  • +, -, * संख्याओं के जोड़, घटाव और गुणा के सामान्य ऑपरेटर हैं।

निर्देश

इस अभ्यास में आप कुछ कोड लिखेंगे, जिससे अपनी पसंदीदा रेसिपी की किताब से एक शानदार लसैगना बनाने में आपको मदद मिलेगी।

आपके सामने चार काम हैं, और सब लसैगना पकाने में लगने वाले समय से जुड़े हैं।

1. मिनटों में ओवन का अपेक्षित समय तय कीजिए

$expected_minutes_in_oven नाम का एक कॉन्स्टेंट बनाइए। रेसिपी की किताब के अनुसार, ओवन में लगने वाला अपेक्षित समय 40 मिनट है:

$ jq -n -f lasagna.jq
{
  "expected_minutes_in_oven": 40,
  ...

2. मिनटों में ओवन का बाकी बचा समय निकालिए

यह वैल्यू इनपुट में लसैगना के ओवन में अब तक बिताए असल मिनट लेती है। फिर पिछले काम में दिए गए अपेक्षित ओवन समय के आधार पर यह बताती है कि लसैगना को ओवन में अभी और कितने मिनट रुकना है।

$ echo '{"actual_minutes_in_oven": 18}' | jq -f lasagna.jq
{
  "expected_minutes_in_oven": 40,
  "remaining_minutes_in_oven": 22,
  ...

3. मिनटों में तैयारी का समय निकालिए

तैयारी का समय यह बताता है कि लसैगना को ओवन में रखने से पहले तैयार करने में कितना समय लगता है। हर परत तैयार करने में 2 मिनट लगते हैं।

$ echo '{"number_of_layers": 3}' | jq -f lasagna.jq
{
  ...
  "preparation_time": 6,
  ...

4. मिनटों में कुल काम का समय निकालिए

लसैगना पकाने में आपने कुल कितने मिनट काम किया, यह निकालिए। यह तैयारी के समय और इस समय ओवन में लसैगना के बिताए समय का जोड़ है।

$ echo '{"actual_minutes_in_oven": 10, "number_of_layers": 2}' | jq -f lasagna.jq
{
  ...
  "total_time": 14,
  ...
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
jq Exercism

लसाग्ना शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और jq को 12 कॉन्सेप्ट75 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।