كيف يمكنك إيقاف لغة Perl عند الإشارة إلى قيمة undef؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

كيف يمكنك جعل لغة Perl تتوقف وتعطي تتبعًا مكدسًا عند الإشارة إلى قيمة undef، بدلاً من مجرد التحذير؟يبدو أن use strict; ليست كافية لهذا الغرض.

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

المحلول

use warnings FATAL => 'uninitialized';

use Carp ();
$SIG{__DIE__} = \&Carp::confess;

السطر الأول يجعل التحذير قاتلاً.يتسبب الاثنان التاليان في تتبع المكدس عندما يموت برنامجك.

نصائح أخرى

بدلاً من العبث الفوضوي %SIG المقترح من قبل الجميع، فقط use الكارب::دائما ويتم ذلك.

لاحظ أنه يمكنك إدخال وحدات نمطية في البرنامج النصي دون إجراء تعديلات على المصدر وذلك ببساطة عن طريق تشغيله باستخدام perl -MCarp::Always;علاوة على ذلك، يمكنك ضبط PERL5OPT متغير البيئة ل -MCarp::Always لتحميله دون تغيير استدعاء البرنامج النصي.(يرى perldoc perlrun.)

تضمين هذا:

use Carp ();

ثم تشمل واحد من هذه السطور في الجزء العلوي من الملف المصدر الخاص بك:

local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;

ال confess سيعطي الخط تتبع المكدس، و cluck الخط أكثر إيجازًا.

إحدى الطرق لجعل هذه التحذيرات قاتلة هي تثبيت معالج إشارة لـ تحذير إشارة افتراضية:

$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };

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

use Carp qw();

[....]

Carp::confess '$variableName is undef' unless defined $variableName;

[....]

عليك عمل هذا يدويا."الإجابات" المذكورة أعلاه لا تعمل!فقط اختبر هذا:

use strict;
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;

my $x = undef; # it would be enough to say my $x;
if (!$x->{test}) {
print "no warnings, no errors\n";
}

سترى أن إلغاء الإشارة لم يسبب أي رسائل خطأ أو تحذيرات.لا أعرف أي طريقة تجعل Perl يكتشف تلقائيًا استخدام undef كمرجع غير صالح.أظن أن الأمر كذلك حسب التصميم، بحيث تعمل عملية التنشيط التلقائي بسلاسة.

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