اللازانيا

اللازانيا

تمرين تعلّمي

مقدمة

المتغيرات

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

عوامل jq التي ستحتاجها في التمرين التعليمي

عامل البديل: //

يُخرج التعبير a // b القيمة b إذا كان a خطأ أو 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. احسب زمن التحضير بالدقائق

زمن التحضير هو المدة اللازمة لتجهيز اللازانيا قبل وضعها في الفرن. يستغرق تحضير كل طبقة دقيقتين.

$ 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.