سؤال

هذا سؤال أفضل الممارسات.

لقد رأيت فقط مشغل سفينة الفضاء Perl (<=>) المستخدم في إجراءات الفرز الرقمي. لكنها تبدو مفيدة في المواقف الأخرى. لا يمكنني التفكير في الاستخدام العملي.

هل يمكن لأي شخص أن يعطيني مثالاً على متى يمكن استخدامه خارج نوع Perl؟

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

المحلول

أنا أكتب نظام تحكم لروبوت جو الذي يريد الذهاب إلى روبوت ماري وإعادة شحنها. يتحركون على طول نقاط عدد صحيح على الخط. يبدأ Joe عند $ j ويمكنه المشي 1 متر في أي اتجاه لكل وحدة زمنية. تقف ماري في $ M ولا يمكنها التحرك - إنها تحتاج إلى إعادة شحن جيدة! سيبدو البرنامج المسيطر على هذا النحو:

while ($m != $j) {
    $j += ($m <=> $j);
}

نصائح أخرى

ال <=> سيكون المشغل مفيدًا لـ خوارزمية البحث الثنائي. معظم لغات البرمجة لا تملك مشغل يقوم بمقارنة ثلاثية مما يجعل من الضروري إجراء مقارنين لكل تكرار. مع <=> يمكنك أن تفعل واحدة فقط.

sub binary_search {
    my $value = shift;
    my $array = shift;
    my $low   = 0;
    my $high  = $#$array;

    while ($low <= $high) {
        my $mid = $low + int(($high - $low) / 2);

        given ($array->[$mid] <=> $value) {
            when (-1) { $low  = $mid + 1 }
            when ( 1) { $high = $mid - 1 }
            when ( 0) { return $mid      }
        }
    }

    return;
}

في أي نوع من طريقة المقارنة. على سبيل المثال ، يمكن أن يكون لديك كائن معقد ولكن لا يزال لديك "ترتيب" محدد ، لذلك يمكنك تحديد وظيفة المقارنة لها (وهو ما لا تفعل ذلك لديك للاستخدام داخل طريقة الفرز ، على الرغم من أنها ستكون مفيدة):

package Foo;

# ... other stuff...

# Note: this is a class function, not a method
sub cmp
{
    my $object1 = shift;
    my $object2 = shift;

    my $compare1 = sprintf("%04d%04d%04d", $object1->{field1}, $object1->{field2}, $object1->{field3});
    my $compare2 = sprintf("%04d%04d%04d", $object2->{field1}, $object2->{field2}, $object2->{field3});
    return $compare1 <=> $compare2;
}

هذا مثال مفتعل تمامًا بالطبع. ومع ذلك ، في رمز Sourcecode لشركتي ، وجدت ما ورد أعلاه تقريبًا ، لمقارنة الكائنات المستخدمة في الاحتفاظ بمعلومات التاريخ والوقت.

أحد الاستخدامات الأخرى التي يمكنني التفكير فيها هو التحليل الإحصائي - إذا تم تشغيل القيمة مرارًا وتكرارًا مقابل قائمة بالقيم ، فيمكنك معرفة ما إذا كانت القيمة أعلى أو أقل من الوسيط الحسابي للمجموعة:

use List::Util qw(sum);
# $result will be
#   -1 if value is lower than the median of @setOfValues,
#    1 if value is higher than the median of @setOfValues,
#    0 if value is equal to the median
my $result = sum(map { $value <=> $_ } @setOfValues);

ها هي واحدة أخرى ويكيبيديا: "إذا كان لا يمكن مقارنة الوسيطتين (على سبيل المثال ، أحدهما نان) ، فإن المشغل يعيد undef." أي يمكنك تحديد ما إذا كان الرقمين هما رقم AA في وقت واحد ، على الرغم من أنني شخصياً سأذهب إلى أقل كبرى القياس :: util:: looks_like_number.

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