لماذا 'الصندوق' لم يتم الكشف عن هذا Perl الشظية ؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

أتوقع كتلة في الثانية 'إذا' البيان إلى أن دخلت بسبب undef القيمة ولكن سجلات تبين أنه لا يتم إدخالها.

sub getcmd{
  my $self = $_[0];
  if ( $self->_recv == OK ){
      push @{$self->{'log'}}, ['NOTICE', "OK"];
      return "My command";          
  }
  push @{$self->{'log'}}, ['ERROR', "Did not get OK back"];
  return undef;
}

...

if (!($ret = $self->getcmd)){
  push @{$self->{'log'}}, ['ERROR', "failed to read after asking for NEXT"];
}
else {
  push @{$self->{'log'}}, ['ERROR', "'undef' not detected in next()"];
}

يظهر ملف السجل:

[Fri May  8 19:25:56 2009]: ERROR: Did not get OK back
[Fri May  8 19:26:02 2009]: ERROR: 'undef' not detected in next()

أي أفكار بامتنان.

تحرير: آسف, كنت تحريرها أسفل رمز لإظهار تدفق الأساسي.كان يجب أن تدقيق أفضل قليلا.

  • أضفت $المتقاعد في getcmd() لمحاكاة ما يحدث في تسجيل وظيفة فقط بطباعة القيمة الحالية $المتقاعد الذي هو عالمي متغير دائما تستخدم لالتقاط عودة القيم.
  • أود أن تشذب رسائل سجل وغاب اضافية "العودة"

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

سوف نعود وننظر مرة أخرى.أعتقد أن هذا ما تحصل عليه عندما نحاول أن ننظر إلى شخص آخر "متوسط" بيرل بعد ثلاثة عشر ساعة في اليوم في محاولة للحصول على الأشياء انتهى "يجب أن تذهب مباشرة يوم الاثنين" هذا المشروع!

أنا لم أكتب رمز ببساطة ورثته.مدونة كتب من قبل اثنين من الناس الذين يعتقدون أنهم لا "لا تحتاج الى steenking تحذيرات أو stricts".

تخيل 800 خطوط Perl و الكثير من 'أنا' ولكن لا آخر البيانات!لا دفاعية الترميز في كل شيء!8-O

مرة أخرى شكرا على مساعدتك.

الهتافات ،

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

المحلول

أعتقد أن هناك شيئا أكثر تعقيدا يجري هنا-تلك رسائل سجل يبدو أن 6 ثوان عن بعضها و لا توجد طريقة ستستغرق 6 ثوان دفع بيان, عودة, و إذا تحقق.

أي فرصة أول تسجيل الرسالة السابقة استدعاء الأسلوب من مكان آخر في التطبيق ؟

نصائح أخرى

خفضت إلى الحد الأدنى ، مطبوعات "صندوق الأمم المتحدة للديمقراطية الكشف عنها".

#!/bin/perl -w

use strict;

sub getcmd
{
    return undef;
}

my $ret;

if (!($ret = getcmd()))
{
    print "undef detected\n";
}
else
{
    print "undef undetected\n";
}

وبالتالي المشكلة الأكثر احتمالا أن $الذاتي>getcmd() لم ترد من صندوق الأمم المتحدة للديمقراطية حتى ولو كنت تعتقد أنه ينبغي.

استخدام بيرل المصحح (perl -د) الخطوة من خلال كود لمعرفة ما يجري.عند تصحيح الأخطاء البرمجية ، من المهم أن حرر عقلك من كل الافتراض.

أيضا, هذه الخطوط يجب أن يكون فوق كل بيرل البرنامج:

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