Имеет ли perl эквивалент +/- бесконечности для сравнения строк? - PullRequest
3 голосов
/ 30 августа 2010

В Perl для численного сравнения у нас есть +/- inf как числа, которые больше / меньше, чем все остальные числа. Существуют ли также строки, которые gt / lt - любая другая строка?

Причина, по которой я спрашиваю, состоит в том, что я хотел бы прикрепить одну или другую к концу списка строк, чтобы гарантировать, что цикл завершится до конца списка.

Ответы [ 3 ]

4 голосов
/ 30 августа 2010

Нет.Но "" будет меньше или равно любой другой строке, и chr (~ 0) повторных достаточных времен будет больше или равно любой строке этой длины или меньше.(Предполагая, что вы не используете сопоставление на основе локали с помощью 'use locale'.)

(для chr (~ 0) потребуется no warnings 'utf8', поскольку оно не входит в диапазоны определенных символов utf8.)

3 голосов
/ 30 августа 2010

Вот полная реализация с тестами для перегруженной строки, которая больше, чем любая другая строка. Это довольно простая перегрузка, зачем крутить аппроксимации?

package String::Infinity;

use overload
    '""'  => sub {
        return "Infinity"
    },
    'cmp' => sub {
        my($left, $right, $reverse) = @_;
        return 0 if ref $right && $right->isa("String::Infinity");
        return $reverse ? -1 : 1;
    },
    fallback => 1
;

sub new {
    my $class = shift;
    return bless \Inf, $class;
}


use Test::More;

my $inf = String::Infinity->new;
is "$inf", "Infinity",  "stringification";
ok $inf eq $inf,        "equals itself"; 
ok $inf ne "foo",       "  doesn't equal anything else";
ok $inf ne "Infinity",  "  even what it stringifies to";
ok $inf gt "lfkdlk",    "  greater than";
ok !$inf lt "lkafj",    "  not less than";
is $inf cmp "lkjd", 1,  "  cmp";
is "ldfjal;kjd" cmp $inf, -1,   "  cmp reversed";

done_testing;
2 голосов
/ 30 августа 2010

Пустая строка или undef меньше, чем любая другая строка.

Нет конечной строки, которая больше, чем любая другая строка. Но если вы можете сделать определенные предположения, что все строки в вашем цикле являются строками ASCII, вы можете указать строку типа "\ x80" (значение ASCII 128), которая будет больше, чем все ваши строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...