كيفية استبدال $*=1 مع بديل الآن $* لم يعد معتمدا

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

  •  01-07-2019
  •  | 
  •  

سؤال

أنا بيرل المبتدئين, صباحا تشغيل البرنامج النصي perl باستخدام بيرل 5.10 و الحصول على هذا التحذير:

$* is no longer supported at migrate.pl line 380.

يمكن لأي شخص أن يصف ما $* هل ما أوصى استبدال الآن ؟ بدلا من ذلك إذا كنت يمكن أن تشير لي إلى الوثائق التي تصف هذه من شأنها أن تكون كبيرة.

السيناريو أنا على التوالي إلى ترحيل مصدر رمز قاعدة البيانات من vss إلى إس ويمكن العثور عليها هنا:http://www.x2systems.com/files/migrate.pl.txt

اثنين من قصاصات من التعليمات البرمجية التي تستخدم هي:

    $* = 1;
    $/ = ':';

    $cmd = $SSCMD . " Dir -I- \"$proj\"";
    $_ = `$cmd`;

    # what this next expression does is to merge wrapped lines like:
    #    $/DeviceAuthority/src/com/eclyptic/networkdevicedomain/deviceinterrogator/excep
    #    tion:
    # into:
    #    $/DeviceAuthority/src/com/eclyptic/networkdevicedomain/deviceinterrogator/exception:
    s/\n((\w*\-*\.*\w*\/*)+\:)/$1/g;

    $* = 0;

ثم بعض الطرق في وقت لاحق:

            $cmd = $SSCMD . " get -GTM -W -I-Y -GL\"$localdir\" -V$version \"$file\" 2>&1";
            $out = `$cmd`;

            # get rid of stupid VSS warning messages
            $* = 1;
            $out =~ s/\n?Project.*rebuilt\.//g;
            $out =~ s/\n?File.*rebuilt\.//g;
            $out =~ s/\n.*was moved out of this project.*rebuilt\.//g;
            $out =~ s/\nContinue anyway.*Y//g;
            $* = 0;

شكرا جزيلا ،

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

المحلول

من perlvar:

استخدام $* هو مستنكر في الحديث بيرل ، قبل محل /s /m المعدلات على نمط مطابقة.

إذا كان لديك الوصول إلى المكان حيث يتم مطابقة مجرد إضافته إلى النهاية:

 $haystack =~ m/.../sm;

إذا كان لديك فقط الوصول إلى السلسلة ، يمكنك تحيط التعبير مع

 qr/(?ms-ix:$expr)/;

أو في حالة:

s/\n((\w*\-*\.*\w*\/*)+\:)/$1/gsm;

نصائح أخرى

من بيرل 5.8 نسخة من perlvar:

تعيين إلى الصفر غير قيمة عدد صحيح أن تفعل متعدد الخطوط مطابقة ضمن سلسلة [...] استخدام $* هو مستنكر في الحديث بيرل ، قبل محل /s ، /m المعدلات على نمط مطابقة.

أثناء استخدام /s /m هو أفضل بكثير, تحتاج إلى تعيين معدلات (مناسب!) لكل العادية التعبير.

perlvar أيضا يقول "هذا المتغير يؤثر على التفسير فقط ^ دولار." مما يعطي الانطباع أنه يعادل /م فقط وليس /s.

علما بأن $* هو متغير عمومي.لأن التغيير لا يتم المحلية مع local الكلمات الرئيسية ، وسوف تؤثر كل التعبيرات العادية في البرنامج ، ليس فقط تلك التي تتبع في كتلة.وهذا سيجعل الأمر أكثر صعوبة تحديث البرنامج النصي بشكل صحيح.

من perldoc perlvar:

$*

تعيين إلى الصفر غير قيمة عدد صحيح أن تفعل متعدد الخطوط مطابقة ضمن سلسلة, 0 (أو معروف) أقول بيرل أنه يمكن أن نفترض أن السلاسل التي تحتوي على سطر واحد ، لغرض تحسين نمط المباريات.نمط المباريات على السلاسل التي تحتوي على عدة أسطر يمكن أن تنتج نتائج مربكة عندما $* 0 أو غير محددة.الافتراضي هو غير معروف.(ذاكري: * مباريات أشياء متعددة.) هذا المتغير يؤثر على التفسير فقط ^ و $.الحرفي السطر يمكنك البحث عنها حتى عندما $* == 0.

استخدام $* هو مستنكر في الحديث بيرل ، قبل محل /s و /m المعدلات على نمط مطابقة.

تعيين غير القيمة العددية إلى $* يطلق تحذيرا (ويجعل $* تتصرف كما لو $* == 0) ، في حين تعيين القيمة العددية إلى $* يجعل ذلك ضمنيا الباحث يطبق على قيمة.

كان في الأساس وسيلة للقول بأن اللاحقة regexes (s/// أو m//) ، ^ أو $ التأكيدات يجب أن تكون قادرة على المباراة قبل أو بعد أسطر جزءا لا يتجزأ في السلسلة.

الموصى به هو ما يعادل m التعديل في نهاية الخاص بك باستخدام التعابير المنطقية (على سبيل المثال ، s/ ((\ث*-*.*\w*/*)+:)/$1/gm;).

فإنه يتحول على موضوع وضع خط.منذ بيرل 5.0 (1994), الطريقة الصحيحة لفعل ذلك هو إضافة m و/أو s التعديل بك regexps مثل هذا

 s/\n?Project.*rebuilt\.//msg
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top