كيف يمكن للسلوك مختلف لمقاييس و "إذا!" بيان يؤثر على تشغيل المدى في سياق العددية؟
-
25-09-2019 - |
سؤال
تشغيل http://novosial.org/perl/one-liner/ لقد وجدت اثنين التاليين اثنين واحد. المخرجات مختلفة لأن ال unless
البيان مختلف عن if !
(بسبب قواعد الارتباط والأسبقية).
cat file: foo bar
perl -ne 'print unless /^$/../^$/' file foo bar
perl -ne 'print if ! /^$/../^$/' file foo bar
كيف يمكن للسلوك مختلف ل if !
-أوالي جعل الخط الثاني إخراج خط واحد فارغ؟
المحلول
كما تقول المقالة المرتبطة ، إنها مسألة ارتباط وأسبقية ...
print unless /^$/../^$/
يعادل print if !(/^$/../^$/)
print if ! /^$/../^$/
يعادل print if (!/^$/)../^$/
لاحظ أن الأول ينفي تعبير النطاق ، في حين أن الثانية تنفي حالة بداية النطاق ، ولكن ليس النطاق نفسه.
نصائح أخرى
الجواب ، IMHO ، هو أنه لا يوجد if !
بيان في بيرل: هناك if
بيان وهناك أ !
المشغل أو العامل. ال !
المشغل لا يرتبط بـ if
; ؛ تعمل على حجتها. إذا بدأت التفكير في هذه الشروط ، فستكون حياتك أسهل.
لذلك ، في حالتك ، لديك ،
do_something() unless something;
و
do_something() if something-else;
دعونا نضع الأقواس غير المرئية عادة:
do_something() unless ( something );
و
do_something() if ( something-else );
في هذه الحالة ، حاولت الكتابة something-else
بحيث تكون قيمة الحقيقة لهذا الشرط تعادل حقيقة something
, ، لكنه فشل في مراعاة حقيقة أن !
يرتبط المشغل بإحكام.
هذا هو السبب في وجود not
.
محاولة
perl -ne 'print if not /^$/../^$/' file
يرى not
في بيرلوك بيرلوب:
أحادي
not
إرجاع النفي المنطقي للتعبير إلى يمينه. إنه ما يعادل!
باستثناء الأسبقية المنخفضة جدا.
سيعود اختبار النطاق إلى ما يصل إلى الوقت الذي يكون فيه المعامل الثاني صحيحًا. سيعود بعد ذلك خطأ في المكالمة التالية.
يخبرنا هذا المقتطف ما يعود إليه مشغل النطاق
perl -ne "$x= ( ! /^$/../^$/ ) ; print qq/$x : $_/" range_test.TXT
الذي ينتج
1 : foo
2E0 :
:
:
1 : bar
لذا فإن الخط الفارغ الأول يولد استجابة حقيقية ، الخطأ التالي