对于字符串比较,perl是否具有+/-无穷大的等效值?

时间:2010-08-30 04:23:42

标签: perl string comparison

在perl中,为了进行数值比较,我们得到+/- inf作为大于/小于其他所有数字的数字。是否还有gt / lt任何其他字符串的字符串?

我问的原因是我想在字符串列表的末尾添加一个或另一个,以确保循环在列表结尾之前终止。

3 个答案:

答案 0 :(得分:4)

没有。但是""将小于或等于任何其他字符串,并且重复足够时间的chr(~0)将大于或等于该长度或更小的任何字符串。 (假设您没有通过'使用区域设置'使用基于区域设置的排序规则。)

(chr(~0)将需要no warnings 'utf8',因为它不在定义的utf8字符的范围内。)

答案 1 :(得分:3)

这是一个完整的实现,其中包含比任何其他字符串更大的重载字符串的测试。它是一个非常简单的重载,为什么要使用近似值?

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 :(得分:2)

空字符串或undef小于其他所有字符串。

没有有限的字符串比每个其他字符串都大。但是,如果您可以做出某些假设,例如循环中的所有字符串都是ASCII字符串,那么您可以指定一个类似于“\ x80”(ASCII值128)的字符串,该字符串将大于您的所有字符串。