كيف أقرأ الفقرات في وقت مع بيرل؟
سؤال
عندما اكتب
#!/usr/bin/perl -w
use strict;
while( <DATA> ) {
print "\n-------------------------\n\n";
print;
<>;
}
بعد كل "عودة" أحصل على سطر واحد.
لماذا لا أحصل على البرنامج النصي التالي بعد كل "إرجاع" فقرة واحدة؟
#!/usr/bin/perl -w
use strict;
local $/ = "";
while( <DATA> ) {
print "\n-------------------------\n\n";
print;
<>;
}
__DATA__
line one
line two
line three
line four
line five
line six
line seven
line eigth
line nine
line ten
line eleven
line twelve
المحلول
في البرنامج النصي الأول ، مع تعيين $/ المتغير إلى الافتراضي " n" ،u003CDATA> سوف يعيد سطر واحد فقط في وقت واحد.
أعتقد أن البرنامج النصي الثاني يفعل ما تريد ، إنه فقط <> لن ينهي القراءة على "العودة" ولكن بدلاً من ذلكu003Cctrl-d> بسبب الإعداد $/ الخاص بك (كما أشار شخص آخر <> يقرأ من stdin ، لكنني أعتقد أنك تعرف ذلك بالفعل وتستخدمه لتنظيم الإخراج).
إذا كنت ترغب حقًا في تنظيم الإخراج مع "العودة" ، فأنت بحاجة إلى بذل المزيد من الجهد باستخدام $/ في الحلقة.
while( <DATA> ) { print "\n-------------------------\n\n"; print; $/ = "\n"; # default so that the following terminates the read on 'return' <>; $/ = ""; }
نصائح أخرى
أعتقد أنك تتوقع هذا الخط
local $/ = "";
لتغيير سلوك
<DATA>
لمواصلة القراءة حتى نهاية البيانات.
ولكن في الحقيقة يتطلب الأمر شيئًا كهذا
{
local $/; # $/ becomes undef in this block
...
}
لتمكين وضع slurp (واحتواء هذا الوضع إلى النطاق داخل {curlys}).
في الواقع ، تقول "نسيت التفكير في Newlines كعلامة نهاية السجل" ،
إلى جانب ذلك ... هناك أ ربطة عنق المقاتلة في الكود الخاص بك!
while( <DATA> ) {
print "\n-------------------------\n\n";
print;
<>; # <-- Feel the power of the DARK SIDE!!!
}
سيقرأ هذا الرجل الصغير من stdin ، وليس من البيانات - هل هذا ما تريده حقًا؟
استخدام <> بهذه الطريقة (بشكل تفاعلي) في وضع الفقرة سيكون مربكا. لن يعود عندما تضغط على "العودة" ؛ بدلاً من ذلك ، سيتم قراءتها حتى تحصل على خط غير فارغ (بداية الفقرة) ، ثم قراءة حتى تحصل على خط فارغ (نهاية تلك الفقرة) ، ثم تابع القراءة حتى تحصل على خط غير فارغ (البداية من الفقرة التالية - التي سيتم تخزينها ، لم يتم إرجاعها) ، فهي تعرف أنه تم التخلص من أي خطوط فارغة إضافية.
ربما يجب أن تستخدم:
local $/ = "\n"; <>
في نهاية حلقتك بدلاً من ذلك. أو ربما posix :: getchar ().