الملفات والنصوص والتعابير الاصطلاحية

لكل لغة برمجة مجموعة من المصطلحات. هذه هي الطرق المعيارية الخالية من الرتوش لإنجاز مجموعة من المهام الشائعة. إنها الطريقة الابتدائية أو الافتراضية لاستخدام إحدى ميزات اللغة التي يعمل بها المبرمج. تصبح جزءًا من مجموعة أدوات المبرمج للمخططات العقلية.

تعتبر الإجراءات مثل قراءة البيانات من الملفات ، والعمل مع الحلقات ، وتبادل قيم متغيرين أمثلة جيدة. سيعرف المبرمج طريقة واحدة على الأقل لتحقيق غاياته بطريقة عامة أو الفانيليا. ربما يكون هذا كافيا للشرط في متناول اليد. أو ربما يقومون بتزيين الكود لجعله أكثر كفاءة أو قابلية للتطبيق على الحل المحدد الذي يطورونه. لكن امتلاك المصطلح الأساسي في متناول أيديهم يعد نقطة انطلاق رائعة.

إن معرفة وفهم المصطلحات في لغة واحدة يجعل من السهل أيضًا اختيار لغة برمجة جديدة. إن معرفة كيفية بناء الأشياء في لغة واحدة والبحث عن المكافئ – أو الأقرب – في لغة أخرى طريقة جيدة لتقدير أوجه التشابه والاختلاف بين لغات البرمجة التي تعرفها بالفعل واللغة التي تتعلمها.

سطور القراءة من ملف: The One-Liner

في Bash ، يمكنك استخدام ملف while حلقة على سطر الأوامر لقراءة كل سطر من النص من ملف والقيام بشيء ما به. يسمى ملفنا النصي “data.txt”. يحتوي على قائمة أشهر السنة.

January
February
March
.
.
October
November
December

خطنا البسيط هو:

while read line; do echo $line; done < data.txt

أثناء قراءة الخط  هل صدى $ line؛  تم <data.txt في نافذة طرفية

ال while تقرأ loop سطرًا من الملف ، ويمر تدفق تنفيذ البرنامج الصغير إلى جسم الحلقة. ال echo يقوم الأمر بكتابة سطر النص في النافذة الطرفية. فشلت محاولة القراءة عندما لا يكون هناك المزيد من الأسطر ا%9تي يجب قراءتها ، وتنتهي الحلقة.

إحدى الحيل الرائعة هي القدرة على إعادة توجيه ملف إلى حلقة. في لغات البرمجة الأخرى ، ستحتاج إلى فتح الملف والقراءة منه وإغلاقه مرة أخرى عند الانتهاء. باستخدام Bash ، يمكنك ببساطة استخدام إعادة توجيه الملف والسماح لـ shell بالتعامل مع كل تلك الأشياء منخفضة المستوى نيابة عنك.

بالطبع ، هذا الخط الواحد ليس مفيدًا بشكل رهيب. يوفر Linux بالفعل ملف cat الأمر الذي يفعل ذلك بالضبط بالنسبة لنا. لقد أنشأنا طريقة طويلة لاستبدال أمر من ثلاثة أحرف. لكنه يوضح بشكل واضح مبادئ القراءة من ملف.

هذا يعمل بشكل جيد ، إلى حد ما. لنفترض أن لدينا ملفًا نصيًا آخر يحتوي على أسماء الأشهر. في هذا الملف ، تم إلحاق تسلسل الهروب لحرف سطر جديد بكل سطر. سنسميها “data2.txt”.

Januaryn
Februaryn
Marchn
.
.
Octobern
Novembern
Decembern

دعنا نستخدم سطر واحد في ملفنا الجديد.

while read line; do echo $line; done < data2.txt

أثناء قراءة الخط  هل صدى $ line؛  تم <data2.txt في نافذة طرفية

حرف الهروب من الشرطة المائلة للخلف ” “تم تجاهله. والنتيجة هي أنه تم إلحاق “n” بكل سطر. يفسر Bash الشرطة المائلة للخلف على أنها بداية ملف تسلسل الهروب. في كثير من الأحيان ، لا نريد أن يفسر باش ما يقرأه. قد يكون من الأسهل قراءة السطر بأكمله – تسلسلات هروب الشرطة المائلة العكسية وكلها – واختيار ما تريد تحليله أو استبداله بنفسك ، ضمن التعليمات البرمجية الخاصة بك.

إذا أردنا إجراء أي معالجة ذات معنى أو تحليل لأسطر النص ، فسنحتاج إلى استخدام برنامج نصي.

سطور القراءة من ملف مع برنامج نصي

هذا هو السيناريو الخاص بنا. إنه يسمى “script1.sh”.

#!/bin/bash

Counter=0

while IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; do

    ((Counter++))
    echo "Accessing line $Counter: ${LinefromFile}"

done < "$1"

قمنا بتعيين متغير يسمى Counter إلى الصفر ، ثم نحدد while عقدة.

العبارة الأولى على السطر while هي IFS='' . IFS لتقف على فاصل المجال الداخلي. إنها تحمل القيم التي يستخدمها Bash لتحديد حدود الكلمات. بشكل افتراضي ، يقطع أمر القراءة المسافة البيضاء البادئة والزائدة. إذا أردنا قراءة الأسطر من الملف كما هي تمامًا ، فنحن بحاجة إلى ضبط IFS لتكون سلسلة فارغة.

يمكننا تعيين هذا مرة واحدة خارج الحلقة ، تمامًا كما نضع قيمة Counter . ولكن مع النصوص الأكثر تعقيدًا – خاصة تلك التي تحتوي على العديد من الوظائف المعرفة من قبل المستخدم – فمن الممكن أن يحدث ذلك IFS يمكن تعيينها على قيم مختلفة في مكان آخر من البرنامج النصي. هل تضمن ذلك IFS على سلسلة فارغة في كل مرة while loop iterates يضمن أننا نعرف ما سيكون سلوكه.

سنقرأ سطرًا نصيًا في متغير يسمى LinefromFile . نحن نستخدم ملف -r (اقرأ الشرطة المائلة للخلف كحرف عادي) لتجاهل الخطوط المائلة العكسية. سيتم معاملتهم مثل أي شخصية أخرى ولن يتلقوا أي معاملة خاصة.

هناك نوعان من الشروط التي سوف تلبي while loop والسماح بمعالجة النص بواسطة جسم الحلقة:

  • read -r LinefromFile : عندما تتم قراءة سطر نصي بنجاح من الملف ، فإن ملف read يرسل الأمر إشارة نجاح إلى while ، و ال while حلقة تمرر تدفق التنفيذ إلى جسم الحلقة. نلاحظ أن read يحتاج الأمر إلى رؤية ملف حرف جديد في نهاية سطر النص لاعتباره قراءة ناجحة. إذا لم يكن الملف بتنسيق بوسيكس ملف نصي متوافق ، ملف قد لا يتضمن السطر الأخير حرف سطر جديد. إذا كان read يرى الأمر نهاية علامة الملف (EOF) قبل إنهاء الخط بسطر جديد ، فسيتم ذلك ليس التعامل معها على أنها قراءة ناجحة. إذا حدث ذلك ، فلن يتم تمرير السطر الأخير من النص إلى نص الحلقة ولن تتم معالجته.
  • [ -n "${LinefromFile}" ] : نحتاج إلى القيام ببعض الأعمال الإضافية للتعامل مع الملفات غير المتوافقة مع POSIX. تتحقق هذه المقارنة من النص المقروء من الملف. إذا لم يتم إنهاؤها بحرف سطر جديد ، فستستمر هذه المقارنة في إرجاع النجاح إلى while عقدة. هذا يضمن أن أي أجزاء خط زائدة يتم معالجتها بواسطة جسم الحلقة.

يتم فصل هاتين الجملتين بواسطة عامل التشغيل المنطقي “أو” ” || “حتى إذا إما الجملة تعيد النجاح ، تتم معالجة النص المسترجع بواسطة جسم الحلقة ، سواء كان هناك حرف سطر جديد أم لا.

في جسم الحلقة الخاصة بنا ، نقوم بزيادة Counter متغير بواحد وباستخدام echo لإرسال بعض الإخراج إلى نافذة المحطة. يتم عرض رقم السطر ونص كل سطر.

لا يزال بإمكاننا استخدام خدعة إعادة التوجيه الخاصة بنا لإعادة توجيه ملف إلى حلقة. في هذه الحالة ، نعيد توجيه $ 1 ، وهو متغير يحمل اسم معلمة سطر الأوامر الأولى التي تم تمريرها إلى البرنامج النصي. باستخدام هذه الخدعة ، يمكننا بسهولة تمرير اسم ملف البيانات الذي نريد أن يعمل البرنامج النصي عليه.

انسخ النص والصقه في محرر واحفظه باسم الملف “script1.sh.” استخدم ال chmod أمر لجعلها قابلة للتنفيذ.

chmod +x script1.sh

chmod + x script1.sh في نافذة طرفية

دعنا نرى ما الذي يجعل البرنامج النصي الخاص بنا من الملف النصي data2.txt والشرطة المائلة العكسية الموجودة بداخله.

./script1.sh data2.txt

./script1.sh data2.txt في نافذة طرفية

يتم عرض كل حرف في السطر حرفيًا. لا يتم تفسير الخطوط المائلة العكسية على أنها أحرف هروب. تم طباعتها كأحرف عادية.

تمرير الخط إلى وظيفة

ما زلنا نردد النص على الشاشة. في سيناريو برمجة في العالم الحقيقي ، من المحتمل أن نكون على وشك القيام بشيء أكثر إثارة للاهتمام مع سطر النص. في معظم الحالات ، من الممارسات البرمجية الجيدة التعامل مع المعالجة الإضافية للخط في وظيفة أخرى.

إليك كيف يمكننا القيام بذلك. هذا هو “script2.sh”.

#!/bin/bash

Counter=0

function process_line() {

    echo "Processing line $Counter: $1"

}

while IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; do

    ((Counter++))
    process_line "$LinefromFile"

done < "$1"

نحدد لدينا Counter متغير كما كان من قبل ، ثم نحدد وظيفة تسمى process_line() . يجب أن يظهر تعريف الوظيفة قبل يتم استدعاء الوظيفة أولاً في البرنامج النصي.

ستقوم وظيفتنا بتمرير سطر النص الذي تمت قراءته حديثًا في كل تكرار لـ while عقدة. يمكننا الوصول إلى هذه القيمة داخل الدالة باستخدام $1 متغير. إذا تم تمرير متغيرين إلى الدالة ، فيمكننا الوصول إلى هذه القيم باستخدام $1 و $2 ، وما إلى ذلك لمزيد من المتغيرات.

تم العثور على while الحلقة هي نفسها بشكل أساسي. يوجد تغيير واحد فقط داخل جسم الحلقة. ال echo تم استبدال الخط بمكالمة إلى process_line() وظيفة. لاحظ أنك لست بحاجة إلى استخدام الأقواس “()” في اسم الوظيفة عندما تقوم باستدعائها.

اسم المتغير الذي يحمل سطر النص ، LinefromFile ، ملفوفة بعلامات اقتباس عند تمريرها إلى الوظيفة. هذا يلبي الخطوط التي تحتوي على مسافات. بدون علامات الاقتباس ، يتم التعامل مع الكلمة الأولى على أنها $1 من خلال الوظيفة ، تعتبر الكلمة الثانية $2 ، وما إلى ذلك وهلم جرا. يضمن استخدام علامات الاقتباس أن يتم التعامل مع سطر النص بالكامل ، تمامًا مثل $1. لاحظ أن هذا هو ليس نفس الشيء $1 الذي يحمل نفس ملف البيانات الذي تم تمريره إلى البرنامج النصي.

لان Counter تم التصريح عنه في النص الأساسي للبرنامج النصي وليس داخل دالة ، يمكن الرجوع إليه داخل ملف process_line() وظيفة.

انسخ النص أعلاه أو اكتبه في محرر واحفظه باسم الملف “script2.sh.” اجعلها قابلة للتنفيذ مع chmod :

chmod +x script2.sh

chmod + x script2.sh في نافذة طرفية

الآن يمكننا تشغيله وتمرير ملف بيانات جديد ، “data3.txt”. يحتوي هذا على قائمة بالأشهر الموجودة فيه وسطر واحد به العديد من الكلمات.

January
February
March
.
.
October
November nMore text "at the end of the line"
December

أمرنا هو:

./script2.sh data3.txt

./script2.sh data3.txt في نافذة طرفية

تتم قراءة الأسطر من الملف وتمريرها واحدًا تلو الآخر إلى ملف process_line() وظيفة. يتم عرض جميع الأسطر بشكل صحيح ، بما في ذلك الأسطر الفردية التي تحتوي على مسافة للخلف وعلامات اقتباس وكلمات متعددة بداخلها.

اللبنات الأساسية مفيدة

هناك قطار فكري يقول أن المصطلح يجب أن يحتوي على شيء فريد لتلك اللغة. هذا ليس اعتقادًا أؤيده. المهم هو أنه يستخدم اللغة بشكل جيد ، ويسهل تذكره ، ويوفر طريقة موثوقة وقوية لتنفيذ بعض الوظائف في التعليمات البرمجية الخاصة بك.

المصدر

المادة السابقةكيفية إعادة تعيين تخصيصات شريط Microsoft Office
المقالة القادمةاجمل بطاقات صباحية 2021

ترك الرد

من فضلك ادخل تعليقك
من فضلك ادخل اسمك هنا