ماذا تعني عبارة "حدد ((حدد (ق)، و$ | = 1) [0])" لا في بيرل؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

ولقد رأيت بعض التعليمات البرمجية مروع مكتوب في بيرل، ولكن لا أستطيع أن رئيس ولا ذيل هذا واحد:

select((select(s),$|=1)[0])

وانها في بعض رمز الشبكات التي نستخدمها للتواصل مع خادم وأفترض انها تفعل شيئا مع التخزين المؤقت (لأنه يحدد $|).

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

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

المحلول

وانها لغة سيئة قليلا لوضع autoflush على الآخر filehandle من STDOUT.

وselect() يأخذ filehandle الموردة و(أساسا) محل STDOUT معها، وتقوم بإرجاع filehandle القديم عندما يكون القيام به.

وهكذا (select($s),$|=1) إعادة توجيه filehandle (تذكر select يعود من العمر واحد)، ويحدد autoflush ($| = 1). وهي تفعل ذلك في قائمة ((...)[0]) وإرجاع القيمة الأولى (والذي هو نتيجة للدعوة select - الأصلي STDOUT)، ثم يمر <م> أن العودة الى select آخر لإعادة filehandle STDOUT الأصلي . تفو.

ولكن الآن فهمت أنه (حسنا، ربما،))، القيام بذلك بدلا من ذلك:

use IO::Handle;
$fh->autoflush;

نصائح أخرى

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

وبت الأول ثم:

( select(s), $|=1 )

وهذه القائمة اثنين من العناصر، التي هي نتائج عمليتين: واحدة لتحديد filehandle s كما الافتراضي ثم واحدة لتحديد $| إلى القيمة الحقيقية. و$| هو واحد من المتغيرات لكل filehandle التي تنطبق فقط على filehandle المحدد حاليا (انظر <لأ href = "http://www.effectiveperlprogramming.com/2010/09/understand-global-variables/" يختلط = "نوفولو noreferrer "> فهم المتغيرات العالمية في <ط> وperler التعليمية الفعالة ). في النهاية، لديك قائمة من بندين: على filehandle الافتراضي السابق (نتيجة select)، و 1

والجزء التالي هو قائمة شريحة الحرفي لسحب عنصر في المؤشر 0:

( PREVIOUS_DEFAULT, 1 )[0]

ونتيجة ذلك هو العنصر الوحيد الذي هو filehandle الافتراضي السابق.

والجزء التالي يأخذ نتيجة لشريحة ويستخدم على أنها حجة لنداء آخر إلى select

 select( PREVIOUS_DEFAULT );

وهكذا، في الواقع، قمت بتعيين $| على filehandle وانتهى بها المطاف الى حيث كنت بدأت مع filehandle الافتراضية.

select($fh)

واختر التعامل مع الملف الافتراضي الجديد. انظر http://perldoc.perl.org/functions/select.html

(select($fh), $|=1)

وبدوره على autoflush. انظر http://perldoc.perl.org/perlvar.html

(select($fh), $|=1)[0]

وإرجاع القيمة الأولى من هذه الصفوف (tuple).

select((select($fh), $|=1)[0])

وselect ذلك، أي استعادة مقبض الملف الافتراضي القديمة.


وأي ما يعادل

$oldfh = select($fh);
$| = 1;
select($oldfh);

وهذا يعني

use IO::Handle;
$fh->autoflush(1);

وكما هو موضح في الصفحة perldoc.

في مكان آخر، وأنا اقترح ذات مرة أن نسخة أكثر مفهومة ستكون على النحو التالي:

for ( select $fh ) { $| = 1; select $_ }

وهذا يحافظ على ميزة الوحيدة في لغة المدمجة التي يتم الإعلان لا يحتاج إلى متغير في نطاق المحيطة بها.

وأو إذا كنت غير مريح مع $_، يمكنك كتابة مثل هذا:

for my $prevfh ( select $fh ) { $| = 1; select $prevfh }

ويقتصر نطاق $prevfh إلى كتلة for. (ولكن إذا كنت أكتب بيرل لديك حقا أي عذر ليكون غير مستقر حول $_).

وهي عبارة عن شفرة ذكية أكثر من اللازم لتشغيل التنظيف عازلة على s مقبض ثم إعادة اختيار المقبض الحالي.

وانظر perldoc -f select لأكثر من ذلك.

perldoc -f تحديد . عن معنى $|، يرجى مراجعة perldoc perlvar

ومن overoptimization لتخطي تحميل IO :: مقبض.

use IO::Handle;
$fh->autoflush(1);

وهو أكثر قابلية للقراءة من ذلك بكثير.

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