perl是否具有+;/-字符串比较的无穷大?

perl是否具有+;/-字符串比较的无穷大?,perl,string,comparison,Perl,String,Comparison,在perl中,为了进行数值比较,我们将+/-inf作为大于/小于其他数字的数字。是否还有gt/lt任何其他字符串 我问这个问题的原因是,我想在字符串列表的末尾钉上一个或另一个,以确保循环将在列表的末尾之前终止。否。但是“将小于或等于任何其他字符串,并且chr(~0)重复足够的次数将大于或等于该长度或更短的任何字符串。(假设您没有通过“使用区域设置”使用基于区域设置的排序规则。) (chr(~0)将要求无警告“utf8”,因为它不在定义的utf8字符范围内。)空字符串或未定义的比其他字符串小 没有

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

我问这个问题的原因是,我想在字符串列表的末尾钉上一个或另一个,以确保循环将在列表的末尾之前终止。

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


(chr(~0)将要求
无警告“utf8”
,因为它不在定义的utf8字符范围内。)

空字符串或
未定义的
比其他字符串小


没有比其他字符串大的有限字符串。但是,如果可以假设循环中的所有字符串都是ASCII字符串,则可以指定一个比所有字符串都大的字符串,如“\x80”(ASCII值128)。

下面是一个完整的实现,其中测试了比任何其他字符串都大的重载字符串。这是一个非常简单的重载,为什么要用近似值来处理呢

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;

根据该链接中的答案,我想我可以编写一个模块来重载比较函数,以便在与任何字符串进行比较时执行我想要的操作。但在实践中,我意识到我唯一要比较的是格式为
YYYYMMDD
的日期字符串,因此我的“无限”字符串是
“9999999”
。我现在有点想写这个模块,很明显,无穷大等于9999999。谁知道呢?嗯,不。我只需要在几千年后停止使用我的脚本。这是一个Y10K错误。好吧,又是一天了,我终于想出了如何以1/3的长度和3倍的清晰度重写整个有问题的代码块。毫不奇怪,更新、更短、更简单的代码不需要无限字符串或任何其他愚蠢的东西。它的效率稍低(O(n^2)而不是O(n)),但它仍然比我能启动和停止秒表更快,所以谁在乎呢?事实证明,我可以假设我所有的字符串都是
le“99999999”
,因为它们都是
YYYYMMDD
格式的日期字符串。使用unde是一件愚蠢的事情,因为与字符串相比,它会发出警告。我接受了这个答案,因为这是在不禁用警告或不自己编写警告的情况下所能做的最好的选择。@Ryan Thompson:~0是对0的补充,perl将使用最大整数(以及最大字符的序数值)。在32位PERL上,它将是chr(4294967295),在64位PERL上,它将是chr(18446744073709551615)。您根本不需要重复
chr(~0)
。因为它不是有效的代码点,所以它不应该出现在程序中的任何实际数据字符串中。@cjm:当字符串x在程序中时,说“字符串x大于此程序中的任何字符串”似乎有点虚伪:)为什么?因为我还没有足够的perl专家经验来编写重载操作符的类。不过这很好。