تذكّر أن برنامج 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 (التي تجمع الأعداد بتطبيق عامل + على كل العناصر)[2,4,8,7] أيضًا إلى length
jq التي ستحتاجها في التمرين التعليمي//
يُخرج التعبير a // b القيمة b إذا كان a خطأ أو 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,
...
زمن التحضير هو المدة اللازمة لتجهيز اللازانيا قبل وضعها في الفرن. يستغرق تحضير كل طبقة دقيقتين.
$ 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.