شما در یک کتابخانهی محلی شغلی گرفتهاید و به سازماندهی مجموعهی کتابهای قدیمی آن کمک میکنید. مراجعان دانشجو اغلب دنبال نقلقولهایی میگردند که نیمهیادشان مانده تا در مقالههای ترمشان به آنها استناد کنند. بهجای اینکه همهی کتابها را دستی از جلد تا جلد بخوانید، تصمیم میگیرید ابزار کوچکی بسازید که آنها را بررسی کند و این نقلقولهای ناقص را پیدا کند.
فایلها را برای یافتن خطهایی که با یک رشتهی جستوجو مطابقت دارند جستوجو کنید و همهی خطهای مطابق را برگردانید.
فرمان grep در Unix فایلها را برای یافتن خطهایی که با یک عبارت باقاعده مطابقت دارند جستوجو میکند.
وظیفهی شما پیادهسازی یک فرمان سادهشدهی grep است که از جستوجوی رشتههای ثابت پشتیبانی میکند.
فرمان grep سه آرگومان میگیرد:
سپس محتوای فایلهای مشخصشده را (به همان ترتیبی که مشخص شدهاند) میخواند، خطهایی را که شامل رشتهی جستوجو هستند پیدا میکند و در پایان آن خطها را به همان ترتیبی که پیدا شدهاند برمیگرداند.
هنگام جستوجو در چند فایل، به ابتدای هر خط مطابق، اسم فایل و یک دونقطه (':') اضافه میشود.
فرمان grep از گزینههای زیر پشتیبانی میکند:
-n شمارهی خط و یک دونقطه (':') را به ابتدای هر خط در خروجی اضافه میکند و شماره را بعد از اسم فایل (در صورت وجود) قرار میدهد.-l فقط اسم فایلهایی را خروجی میدهد که دستکم یک خط مطابق دارند.-i مطابقت را با مقایسهای بدون توجه به بزرگی و کوچکی حروف انجام میدهد.-v برنامه را معکوس میکند: همهی خطهایی را که مطابقت ندارند جمع میکند.-x فقط خطهایی را جستوجو میکند که رشتهی جستوجو با کل خط مطابقت داشته باشد.پیادهسازی کنید:
grep ( pattern flags files -- lines )pattern رشتهی جستوجو است، flags آرایهای است از صفر یا چند رشتهی پرچم "-n"، "-l"، "-i"، "-v" و "-x". files هم آرایهای است از یک یا چند اسم فایل. خطوط منطبق را (همراه با هر پیشوند اسم فایل و شماره خط که خواسته شده است) بهصورت آرایهای از رشتهها برگردانید.
وقتی پرچم -l داده میشود، آرایهای از اسم فایلهایی را برگردانید که دستکم یک تطابق دارند.
خطوط یک فایل را با file-lines بخوانید و یک کدگذاری هم به آن بدهید:
USING: io.encodings.utf8 io.files ;
"iliad.txt" utf8 file-lines
! => { "Achilles sing, O Goddess! Peleus' son;" ... }
سه فایل نمونه (iliad.txt، midsummer-night.txt و paradise-lost.txt) همراه تمرین در پوشهی کاری قرار دارند، پس خواندنشان با اسم بهسادگی کار میکند.