كيف يمكن للسلوك مختلف لمقاييس و "إذا!" بيان يؤثر على تشغيل المدى في سياق العددية؟

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

سؤال

تشغيل 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

لذا فإن الخط الفارغ الأول يولد استجابة حقيقية ، الخطأ التالي

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