هل يتطابق معدّل regex الخاص بـ Perl /m بشكل مختلف على نظام التشغيل Windows؟

StackOverflow https://stackoverflow.com/questions/214517

  •  03-07-2019
  •  | 
  •  

سؤال

تعمل عبارات Perl التالية بشكل مماثل على أجهزة Unixish.هل يتصرفون بشكل مختلف على نظام التشغيل Windows؟إذا كانت الإجابة بنعم، فهل هو بسبب السحر ؟

  split m/\015\012/ms, $http_msg;
  split m/\015\012/s, $http_msg;

لدي فشل على إحدى وحدات CPAN الخاصة بي من جهاز اختبار الدخان Win32.يبدو أنها مشكلة مقابل .أحد التغييرات التي أجريتها مؤخرًا هو إضافة //m إلى التعبيرات العادية الخاصة بي.

هل كانت مفيدة؟

المحلول

لهذه التعابير:

m/\015\012/ms
m/\015\012/s

كلا /m و /s لا معنى لهما.

  • /س:يصنع . مباراة \n أيضاً.التعبير العادي الخاص بك لا يحتوي على .
  • /م:يصنع ^ و $ تطابق بجانب المضمنة \n في السلسلة.التعبير العادي الخاص بك يحتوي على لا ^ ولا $, ، أو مرادفاتها.

ما هو ممكن بالفعل هو إذا كان مقبض الإدخال الخاص بك (المقبس؟) يعمل في وضع النص، فإن \r (\015) سيتم حذف الأحرف على نظام التشغيل Windows.

اذا مالعمل؟أقترح صنع \015 الأحرف اختيارية، والانقسام ضد

/\015?\012/

لا حاجة لـ /m أو /s أو حتى البادئة m//.تلك مجرد عبادة البضائع.

نصائح أخرى

لا يوجد سحر \n.كلاهما \n و \r تعني دائمًا حرفًا واحدًا بالضبط، وعلى جميع الأنظمة الأساسية المستندة إلى ASCII \cJ و \cM على التوالى.(الاستثناءات هي منصات EBCDIC (لأسباب واضحة) وMacOS Classic (حيث \n و \r كلاهما يعني \cM).)

السحر الذي يحدث على نظام التشغيل Windows هو أنه عند إجراء الإدخال/الإخراج من خلال مقبض ملف تم وضع علامة عليه على أنه في وضع النص، \r\n يتم ترجمته إلى \n عند القراءة والعكس عند الكتابة.(أيضًا، \cZ يُؤخذ على أنه يعني نهاية الملف - مفاجأة!) ويتم ذلك في طبقة مكتبة وقت التشغيل C.

أنت بحاجه إلى binmode المقبس الخاص بك لإصلاح ذلك.

يجب عليك أيضًا إزالة /s و /m المعدلات من النمط الخاص بك:نظرًا لأنك لا تستخدم الأحرف التعريفية التي يقومون بتعديل سلوكها (. و ال ^/$ الزوج، على التوالي)، فإنهم لا يفعلون شيئا – عبادة البضائع.

لماذا قمت بإضافة /m؟ هل تحاول تقسيم على الخط؟ للقيام بذلك مع /m تحتاج إلى استخدام إما ^ أو $ في التعبير المعتاد:

my @lines = split /^/m, $big_string;

ولكن، إذا كنت ترغب في التعامل مع سلسلة كبيرة كخطوط، مجرد فتح filehandle في إشارة إلى العددية:

open my $string_fh, '<', \ $big_string;
while( <$string_fh> ) {
    ... process a line
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top