Grep

Grep

دشوار

مقدمه

شما در یک کتابخانه‌ی محلی شغلی گرفته‌اید و به سازماندهی مجموعه‌ی کتاب‌های قدیمی آن کمک می‌کنید. مراجعان دانشجو اغلب دنبال نقل‌قول‌هایی می‌گردند که نیمه‌یادشان مانده تا در مقاله‌های ترمشان به آن‌ها استناد کنند. به‌جای اینکه همه‌ی کتاب‌ها را دستی از جلد تا جلد بخوانید، تصمیم می‌گیرید ابزار کوچکی بسازید که آن‌ها را بررسی کند و این نقل‌قول‌های ناقص را پیدا کند.

دستورالعمل‌ها

فایل‌ها را برای یافتن خط‌هایی که با یک رشته‌ی جست‌وجو مطابقت دارند جست‌وجو کنید و همه‌ی خط‌های مطابق را برگردانید.

فرمان grep در Unix فایل‌ها را برای یافتن خط‌هایی که با یک عبارت باقاعده مطابقت دارند جست‌وجو می‌کند. وظیفه‌ی شما پیاده‌سازی یک فرمان ساده‌شده‌ی grep است که از جست‌وجوی رشته‌های ثابت پشتیبانی می‌کند.

فرمان grep سه آرگومان می‌گیرد:

  1. رشته‌ای که باید جست‌وجو شود.
  2. صفر یا چند گزینه برای سفارشی‌سازی رفتار فرمان.
  3. یک یا چند فایل برای جست‌وجو.

سپس محتوای فایل‌های مشخص‌شده را (به همان ترتیبی که مشخص شده‌اند) می‌خواند، خط‌هایی را که شامل رشته‌ی جست‌وجو هستند پیدا می‌کند و در پایان آن خط‌ها را به همان ترتیبی که پیدا شده‌اند برمی‌گرداند. هنگام جست‌وجو در چند فایل، به ابتدای هر خط مطابق، اسم فایل و یک دونقطه (':') اضافه می‌شود.

گزینه‌ها

فرمان grep از گزینه‌های زیر پشتیبانی می‌کند:

  • -n شماره‌ی خط و یک دونقطه (':') را به ابتدای هر خط در خروجی اضافه می‌کند و شماره را بعد از اسم فایل (در صورت وجود) قرار می‌دهد.
  • -l فقط اسم فایل‌هایی را خروجی می‌دهد که دست‌کم یک خط مطابق دارند.
  • -i مطابقت را با مقایسه‌ای بدون توجه به بزرگی و کوچکی حروف انجام می‌دهد.
  • -v برنامه را معکوس می‌کند: همه‌ی خط‌هایی را که مطابقت ندارند جمع می‌کند.
  • -x فقط خط‌هایی را جست‌وجو می‌کند که رشته‌ی جست‌وجو با کل خط مطابقت داشته باشد.

فرایند IO

برخلاف تمرین‌های دیگر، grep نیازمند تعامل با «دنیای بیرونی» است: خواندن فایل‌ها، مدیریت خطاهای سیستمی و چاپ در stdout.

در Lean، تعامل با سیستم معمولاً در موناد IO انجام می‌شود، که اجازه می‌دهد عوارض جانبی در محیطی محدود رخ دهند بدون آنکه وضعیت خالص بیشتر توابع دیگر را تحت تأثیر قرار دهند.

خواندن آرگومان‌ها

Lean اجازه می‌دهد یک فایل به‌عنوان اسکریپت فراخوانی شود، چه مستقیم به‌صورت یک اسکریپت مستقل با lean --run و چه با استفاده از lake.

یک پروژه‌ی Lean یک نقطه‌ی ورود دارد، تابعی به اسم main که یک List String با همه‌ی آرگومان‌های ارسال‌شده به آن می‌گیرد. برای شبیه‌سازی اجرای Grep.lean به‌عنوان یک فایل اجرایی، در این تمرین آرگومان‌ها به همین شکل ارسال می‌شوند.

خواندن فایل‌ها

Lean توابعی برای کار با فایل‌ها در موناد IO.FS ارائه می‌دهد. برای مثال، می‌توان از IO.FS.readFile استفاده کرد تا محتوای فایلی در یک مسیر مشخص را به‌صورت یک String بخواند.

نوشتن خروجی

این تمرین به‌جای برگرداندن یک مقدار، نوشتن نتایج در خروجی استاندارد یا خطای استاندارد را لازم می‌داند. توابعی در Lean برای این منظور وجود دارد.

مدیریت خطاهای سیستمی

برخلاف خطاها در Except، استثناهای IO در واقع استثناهای زمان اجرا هستند. می‌توانید از try/catch برای مدیریت آن‌ها استفاده کنید:

try
    /- 
        code that may possibly raise an exception 
    -/
catch msg =>
    /-
        code that is executed only if an exception was thrown
    -/
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Lean Exercism

آماده‌اید Grep را شروع کنید؟

در Exercism ثبت‌نام کنید تا Lean را همراه با 100 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.