كيف يمكنني تجريد كتلة التعليقات مع بيرل؟
سؤال
أنا أعمل على Preprocessor الذي يحلل DSL. هدفي هو إزالة التعليقات. يتم ترسيم مرفق كتلة التعليق بواسطة %%
قبل وبعد. لا داعي للقلق حوالي ٪٪ في سلاسل، من خلال تعريف اللغة.
أنا أستخدم هذا s///
regex. لسوء الحظ، يبدو أن تطابق كل شيء وقم بمسحها:
#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;
ما الخطأ الذي افعله؟
المحلول
أول شيء يمكنك القيام به هو جعله غير جشع:
.*?
غير ذلك،
٪٪ بعض النصوص ٪٪
المحتوى الحقيقي
٪٪ نص آخر ٪٪
سيتم مسح جميعها.
نصائح أخرى
من Perlfaq6: ماذا يعني أن Regexes جشع؟ كيف يمكنني الحصول على حولها؟
يعني معظم الناس أن Regexes الجشع تطابق قدر الإمكان. من الناحية الفنية، إنها في الواقع الكميات (؟، *، +، {}) الجشع بدلا من النمط بأكمله؛ بيرل تفضل الجشع المحلي والإرضاء الفوري للجشع العام. للحصول على إصدارات غير جشعة من نفس الكميات، استخدم (؟، *، +؟، {}؟).
مثال:
$s1 = $s2 = "I am very very cold";
$s1 =~ s/ve.*y //; # I am cold
$s2 =~ s/ve.*?y //; # I am very cold
لاحظ كيف توقف الاستبدال الثاني عن مطابقة بمجرد مواجهته "Y". ال *؟ يحكي الكم بشكل فعال محرك التعبير العادي للعثور على تطابق في أسرع وقت ممكن وممارسة التحكم في كل ما هو التالي في السطر، كما لو كنت تلعب البطاطا الساخنة.
على افتراض أنك قرأت الكود بالكامل في المتغير $ Str وبين ٪٪ و ٪٪ لا يوجد أي إمكانية يحدث في٪ واحد، يمكنك استخدام هذا.
$ str = ~ s / ٪٪ ([^٪] +) ٪٪ // g؛