لماذا لا بيرل طباعة النص الأخير قبل أن المخرج ؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

بلدي لن يتم تشغيل الكود السطر الأخير قبل" exit; "وليس لدي أي فكرة عن السبب.حاولت وضع إضافية printf $fh خط قبل exit, لكن ذلك لم ينجح أيضا ؛ لن طباعة خط.كل شيء آخر يطبع بخير ما عدا الأخير طباعة البيانات قبل الخروج.

أي فكرة لماذا يحدث هذا ؟ أو الأفضل من ذلك ، كيفية إصلاح أو العمل حول ذلك ؟

    if($i>0 && $i<3)
    {
        printf $fh "Partial match found.\n";
        if($matched_uid){printf $fh "UID #: ".$arguid." exists.\n";}
        if($matched_id){printf $fh "ID #: ".$argid." exists.\n";}
        if($matched_uname){printf $fh "Username: ".$arguname." exists.\n";}
        printf $fh "Aborting."; 
        exit;
    }

تحرير:
جزء من كود نسخ الواردة في هذا

select $fh; $| = 1; #set auto flush

ربما هذا هو السبب في النتائج لا يمكن أن تتكرر....

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

المحلول

في محاولة "لإجهاض. "

هذا يبدو وكأنه مسألة التخزين المؤقت.

نصائح أخرى

أعطى R.Bemrose صوتي, ولكن إذا $fh هو التعامل مع ملف قد ترغب أيضا close قبل أن تنتهي.

كما تستخدمه printf خطأ.printf هو لا 'طباعة الملف'.لها 'print format'.

هذا المثال الأخير

  print $fh 'Message' ;  

هو كل ما تحتاج.

printf يتم استخدامه هكذا:

printf $fh 'some format %s  and more %s ' ,  $var , $var ; 

أو

   printf 'some format %s  and more %s ' ,  $var , $var ; 

و equivelant إلى القيام

   print $fh sprintf 'format %s more %s' , $var , $var ; 

و بسبب هذا, أنت تضع وغني عن رمز المخاطر في حالة أي من الخاص بك متصلا المتغيرات بتوسيع '%' في نفوسهم.على سبيل المثال من الناس من الوقوع في هذا الفخ ، انظر س:308417:لماذا Perl إزالة الأحرف من الملف ؟

perldoc -f print

print FILEHANDLE LIST
print LIST
print   Prints a string or a list of strings.

perldoc -f printf

printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
      Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\" 
      (the output record separator) is not appended

مزيد من التحقيق

لقد تم التحقيق في مشكلة أخرى لأنني لا أستطيع الحصول على "التخزين المؤقت" شرط أن تحدث.كل ما عندي من الملفات بشكل صحيح مسح ما إذا كان أو لا كنت مطاردة لهم.( Perl 5.10 ).

هيريس بلدي مقتطف الشفرة أحاول:

#!/usr/bin/perl 

use strict;
use warnings;


open my $fh , '>' , '/tmp/oo.txt'; 

my $exit_at = int(rand( 200_000 ));
print "$exit_at\n";
sleep 2;
for ( 0 .. ( $exit_at * 2 ) ){ 
    print $fh $_;
    if ( $_ == $exit_at ){
        printf $fh '%n' ; # Bad Code Causes Early Death. 
        printf $fh 'last line';
        exit; 
    }
    if ( $_ % 1000  ){
        print $fh "\n";
    }
}

أنا باستخدام ملكة جمال بك-استخدام printf.الخط الذي علق إخراج رسالة خطأ لأنها ليست صالحة بسبب أحد توفير 'n' المعلمة ، وأنه يموت مع:

Modification of a read-only value attempted at iotest.pl line 15.

قبل تنفيذ الماضي 'خط' طباعة ( أيضا سيئة, لكن لا يوجد % رموز في ذلك فلا بأس ) جعل 'السطر الأخير' غائبة عن ملف الإخراج.

يرجى إصلاح الخاص بك printf و استخدام عادي-القديم-طباعة بدلا من ذلك ومعرفة ما إذا كان هذا يحل المشكلة.

بيرل مخازن انتاجها.يمكنك إيقاف autobuffering مع

local $| = 1;

تحرير:أنا ما ضرب !بدلا من | لأول مرة...ثابت.أي فكرة كيف حدث ذلك, أنهم على طرفي نقيض من لوحة المفاتيح.

في موضوع الاستخدام السليم print, أنت تجعل الأمور صعبة قليلا على نفسك.

أقحم المتغيرات الخاصة بك بدلا من وصل السلاسل معا.استخدام واحد print مع قائمة من السلاسل للطباعة ، بدلا من سلاسل متعددة.

هنا طريقة واحدة:

if( $i>0 && $i<3 )
{
    print $fh join "\n", 
        "Partial match found.",
        $matched_uid   ? "UID #: $arguid exists."      : (),
        $matched_id    ? "ID #: $argid exists."        : (),
        $matched_uname ? "Username: $arguname exists." : (),
        "Aborting.",
        ;

    exit;
}

على () على كاذبة جانب الثلاثي المشغل قائمة فارغة ، والتي سوف تختفي عندما الحجج للانضمام هي بالارض.إذا كنت قد استخدمت و سلسلة فارغة ('') كل غير مطابقة المعيار أنتجت خط فارغة إضافية في النتائج.

يمكنك أيضا إضافة السطر على كل بند ومن ثم تخطي الانضمام إلى, إذا كنت تشعر أن هذا هو أكثر قابلية للقراءة:

    print $fh  
        "Partial match found.\n",
        $matched_uid   ? "UID #: $arguid exists.\n" : '',
        ...

تحتاج إلى إضافة زائدة الماضي printf.وإلا فإن الناتج لا تحصل على مسح إلى وحدة التحكم.

أما ديفيد نورمان هو صحيح أو المشكلة في مكان آخر.أنا فقط كتابة التعليمات البرمجية داخل إذا كتلة في بيرل مترجم, وهي مطبوعة "إجهاض". كما كان متوقعا.(لأنها عملت لي حتى من دون إنهاء حرف السطر الجديد.)

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