شما در یک کتابخانهی محلی شغلی گرفتهاید و به سازماندهی مجموعهی کتابهای قدیمی آن کمک میکنید. مراجعان دانشجو اغلب دنبال نقلقولهایی میگردند که نیمهیادشان مانده تا در مقالههای ترمشان به آنها استناد کنند. بهجای اینکه همهی کتابها را دستی از جلد تا جلد بخوانید، تصمیم میگیرید ابزار کوچکی بسازید که آنها را بررسی کند و این نقلقولهای ناقص را پیدا کند.
فایلها را برای یافتن خطهایی که با یک رشتهی جستوجو مطابقت دارند جستوجو کنید و همهی خطهای مطابق را برگردانید.
فرمان grep در Unix فایلها را برای یافتن خطهایی که با یک عبارت باقاعده مطابقت دارند جستوجو میکند.
وظیفهی شما پیادهسازی یک فرمان سادهشدهی grep است که از جستوجوی رشتههای ثابت پشتیبانی میکند.
فرمان grep سه آرگومان میگیرد:
سپس محتوای فایلهای مشخصشده را (به همان ترتیبی که مشخص شدهاند) میخواند، خطهایی را که شامل رشتهی جستوجو هستند پیدا میکند و در پایان آن خطها را به همان ترتیبی که پیدا شدهاند برمیگرداند.
هنگام جستوجو در چند فایل، به ابتدای هر خط مطابق، اسم فایل و یک دونقطه (':') اضافه میشود.
فرمان grep از گزینههای زیر پشتیبانی میکند:
-n شمارهی خط و یک دونقطه (':') را به ابتدای هر خط در خروجی اضافه میکند و شماره را بعد از اسم فایل (در صورت وجود) قرار میدهد.-l فقط اسم فایلهایی را خروجی میدهد که دستکم یک خط مطابق دارند.-i مطابقت را با مقایسهای بدون توجه به بزرگی و کوچکی حروف انجام میدهد.-v برنامه را معکوس میکند: همهی خطهایی را که مطابقت ندارند جمع میکند.-x فقط خطهایی را جستوجو میکند که رشتهی جستوجو با کل خط مطابقت داشته باشد.این تمرین crateی anyhow را معرفی میکند که رسیدگی به انواع دلخواه خطا را آسان میکند.
هدفش این است که وقتی یک برنامه مینویسید، نگران این نباشید که تابعی که فراخوانی میکنید چه خطاهای مشخصی را برمیگرداند؛ فقط هنگام انتشار آنها کار درست را انجام دهید.
توجه: استفاده از anyhow هنگام نوشتن یک کتابخانه، آنگونه که ما اینجا انجام میدهیم، در واقع کار چندان پسندیدهای نیست؛ هنگام نوشتن یک کتابخانه بهتر است enumی به اسم Error خودتان بنویسید (احتمالاً به کمک ماکروهای کمکی مثل آنهایی که crateی thiserror فراهم میکند)، چون این کار صریحتر و مفیدتر است. اما ما اینجا عمداً و بهصراحت این کار را میکنیم تا کاربرد این crate را نشان دهیم.
برای آشنایی بیشتر با این crate به مستندات آن مراجعه کنید.
هرچند این تمرین فقط از شما میخواهد که ابتداییترین توابع grep را پیادهسازی کنید، در واقع پروژهای وجود دارد که grep را بهطور کامل در Rust بازپیادهسازی میکند: ripgrep.
اگر ایدهی بازنویسی برنامههای ابزاری پایه با Rust را دوست داشتید، حتماً پروژههای زیر را ببینید: