هل يمكنني تخطي ملف كامل مع المشغل <>؟
-
07-07-2019 - |
سؤال
رمز 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 *|'