سؤال

هذا مقتطف من كود بيرل في البرنامج يعطي نتيجة خاطئة.

$condition ? $a = 2 : $a = 3 ;
print $a;

بغض النظر عن قيمة $condition هو الإخراج هو دائما 3, كيف ذلك ؟

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

المحلول

وهذا هو موضح في بيرل الوثائق.

بسبب بيرل مشغل الأسبقية البيان يجري تحليل كما

($condition ? $a= 2 : $a ) = 3 ;

لأن ?:مشغل ينتج احالة النتيجة 3 تم تعيينه إلى نتيجة الشرط.

عند $الشرط صحيحا هذا يعني ($a=2)=3 إعطاء $a=3

عند $شرط باطل وهذا يعني ($a)=3 إعطاء $a=3

الطريقة الصحيحة لكتابة هذا

$a = ( $condition ? 2 : 3 );
print $a;

لدينا للعض من قبل هذا في العمل ، لذلك أنا نشر هنا على أمل أن الآخرين سوف تجد أنه من المفيد.

نصائح أخرى

مرة واحدة لديك فكرة أنك قد تكون تعاني من الأسبقية مشاكل خدعة إلى معرفة لأي بيرل لك:

perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;'

في الحالة التي سوف تظهر لك:

(($condition ? ($a = 2) : $a) = 3);
print($a);
-e syntax OK

...في هذه النقطة يجب أن يكون قائلا "هذا يفسر أنه"!

فقط تمديد الإجابة السابقة...إذا كان لأي سبب من الأسباب المهام التي تحتاج إلى أن تكون جزءا من الشرطي, كنت أريد أن أكتب ذلك هكذا:

$condition ? ($a=2) : ($a=3);

هذا من شأنه أن يكون مفيدا إذا كنت تعيين متغيرات مختلفة استنادا إلى الشرط.

$condition ? ($a=2) : ($b=3);

وإذا كنت اختيار متغير, ولكن تعيين نفس الشيء بغض النظر عن ما ، حتى يمكنك أن تفعل هذا:

($condition ? $a : $b) = 3;

بسبب بيرل مشغل الأسبقية البيان يجري تحليلها كما يلي:

($condition ? $a = 2 : $a ) = 3 ;

لأن ?:مشغل ينتج احالة النتيجة 3 تم تعيينه إلى نتيجة الشرط.

عند $الشرط صحيحا هذا يعني $a=2=3 إعطاء $a=3

عند $شرط باطل وهذا يعني $a=3 إعطاء $a=3

الطريقة الصحيحة لكتابة هذا

$a = $condition ? 2 : 3;

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

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

$x < 3 ? foo($x) : bar($y);

أو مثل هذا ؟

if ($x < 3) {
  $foo($x);
} else {
  $bar($y);
}

اقتراح واحد Tithonium الجواب أعلاه:

إذا كنت ترغب في تعيين قيم مختلفة لنفس المتغير ، وهذا قد يكون أفضل (نسخ-كتاب الطريق):

$a = ($الشرط) ?2 :3;

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