سؤال

رمز Perl التالي له عدم كفاءة واضحة ؛

while (<>)
{
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;}
... or do something useful
}

سوف يخطو الرمز من خلال كل سطر من الملف الذي لا نريده.

على حجم الملفات ، من غير المرجح أن يحدث هذا البرنامج النصي الذي يتم تشغيله على هذا الفارق الملحوظ ، ولكن من أجل التعلم ؛ كيف يمكنني تشغيل الملف بأكمله <> هل يعمل والانتقال إلى الملف التالي؟

الغرض من ذلك هو أن Sever هذا البرنامج النصي يعمل على متاجر الإصدارات القديمة من التطبيقات مع رقم الإصدار في اسم الملف ، أنا مهتم فقط بالإصدار الحالي.

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

المحلول

GREP ARGV أولاً.

@ARGV = grep { $_ !~ /\d+\.\d+\.\d+/ } @ARGV;

while (<>)
{
  # do something with the other files
}

نصائح أخرى

حل بول روب هو الأفضل إذا كنت تستطيع التصفية @ARGV قبل البدء في قراءة أي ملفات.

إذا كان عليك تخطي ملف بعد أن بدأت تكراره ،

while (<>) {
    if (/# Skip the rest of this file/) {
        close ARGV;
        next;
    }
    print "$ARGV: $_";
}

بول روب إجابه يعمل لمزيد من المعلومات ، انظر قسم مشغلي IO في صفحة Perlop Man. تم ذكر نمط استخدام GREP وكذلك بعض الأشياء الأخرى المتعلقة بـ <>.

لاحظ ذكر argv :: readonly فيما يتعلق بأشياء مثل:

perl dangerous.pl 'rm -rfv *|'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top