كيف يمكنني العثور على أحرف ASCII ممتدة في ملف باستخدام Perl؟

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

سؤال

كيف يمكنني العثور على أحرف ASCII ممتدة في ملف باستخدام Perl؟ هل يمكن لأي شخص الحصول على البرنامج النصي؟

.....شكرا مقدما.....

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

المحلول

منذ ممتدة ASCII الشخصيات لها قيمة 128 وأعلى, ، يمكنك الاتصال فقط ترتيب على الأحرف الفردية ومعالجة تلك ذات القيمة> = 128. يقرأ الكود التالي من stdin ويطبع فقط أحرف ASCII الممتدة:

while (<>) {
  while (/(.)/g) {
    print($1) if (ord($1) >= 128);
  }
}

بدلاً عن ذلك، أفرغ معا مع CHR سوف تعمل أيضا. مثال:

while (<>) {
  foreach (unpack("C*", $_)) {
    print(chr($_)) if ($_ >= 128);
  }
}

(أنا متأكد من أن بعض المعلم بيرل يمكنه تكثيف كلاهما على اثنين من اللاعبين ...)


لطباعة أرقام الأسطر بدلاً من ذلك ، يمكنك استخدام ما يلي (لا يزيل هذا التكرارات ، وسيكون له سلوك غريب عند تمرير Unicode):

while (<>) {
  while (/(.)/g) {
    print($. . "\n") if (ord($1) >= 128);
  }
}

(شكرًا ياكوف بيلش ل $. تلميح.)

نصائح أخرى

أول حرف ASCII قابل للطباعة space (32). آخر حرف ASCII قابل للطباعة ~ (126). لذلك ربما كنت أستخدم

while (<>) {
  print "$.\n" if /[^ -~]/;
}

على الرغم من أنها ستعرف ، من المسلم به أيضًا عرض خطوط تحتوي على أحرف تحكم بالإضافة إلى ASCII الممتدة.

يحرر: تم تغييره لطباعة رقم السطر بدلاً من الخط نفسه.

oneliner:

perl -nE'say$.if/[\xE0-\xFF]/'

لإصدارات بيرل الأقدم

perl -lne'print$.if/[\xE0-\xFF]/'

سؤال حاسم هو ما إذا كان

استخدام البايتات.

يجب أن تكون براغما سارية. يجب أن يقرر الملصق ذلك. لالتقاط الشخصيات مع وجود رموز أكبر من 127 ، فإن ما يلي يكفي:

print grep 127 < ord, split // while <>;

أو

print grep /[^[:ascii:]]/, split // while <>;

إجابة Hynek -pichi- vychodil:

perl -nE'say$.if/[\xE0-\xFF]/'

يفترض فقط اختبارات جزء محدود من غير الطباعة

perl -nE'say$.if/[\x80-\xFF]/'

في حين أن.

ماذا عن جريب؟

grep [\x00-\x1F\x7F-\xFF]+ *
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top