سؤال

عندما اكتب

#!/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 ().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top