Perl是否有与字符串比较相关的正负无穷相等的概念?

3
在perl中,对于数字比较,我们有+/- inf作为大于/小于其他任何数字的数字。是否也有字符串是大于/小于任何其他字符串的呢?
我之所以问这个问题,是因为我想在字符串列表的末尾添加一个字符串,以确保循环在列表结束之前终止。

1
请参见 https://dev59.com/JU_Sa4cB1Zd3GeqP9Rk5。 - Jon Purdy
1
显然,无穷大等于99999999。谁知道呢? - Jon Purdy
好了,又是一天,我终于想出了如何将整个有问题的代码块重写为原来长度的三分之一,并且清晰度提高了三倍。毫不奇怪,新的、更短、更简单的代码不需要无限字符串或其他任何愚蠢的东西。它的效率略低(O(n^2)而不是O(n)),但仍然比我启动和停止秒表更快地完成我所需的工作,所以谁在乎呢? - Ryan C. Thompson
可能是如何在Perl中创建或测试NaN或无穷大?的重复问题。 - Ether
这不是那个问题的副本。这与数字无关。 - Ryan C. Thompson
显示剩余2条评论
3个回答

4
不是。但是""会小于或等于任何其他字符串,而chr(〜0)重复足够的次数将大于或等于该长度或更短的任何字符串。(假设您不使用基于语言环境的排序方式“use locale”)。 (假设您没有使用基于语言环境的排序方式“use locale”。)(chr(〜0)将需要no warnings'utf8',因为它不在定义的utf8字符范围内。)

@Ryan Thompson: ~0 是 0 的取反,是 perl 将使用的最大整数(因此是最大字符的序数值)。在 32 位 perl 中,它将是 chr(4294967295),在 64 位 perl 中,是 chr(18446744073709551615)。 - ysth
你根本不需要重复使用 chr(〜0)。由于它不是有效的代码点,因此它不应出现在程序中任何真实数据字符串中。 - cjm
@cjm:当字符串x在程序中时,说“字符串x大于程序中的任何字符串”似乎有点虚伪 :) - ysth

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;

为什么?因为我还不够熟练,不能编写重载运算符的类。尽管如此,这仍然很不错。 - Ryan C. Thompson

2

空字符串或undef小于任何其他字符串。

不存在一个有限的字符串比任何其他字符串都大。但是,如果您可以做出某些假设,比如您循环中的所有字符串都是ASCII字符串,那么您可以指定一个字符串"\x80"(ASCII值为128),它将大于所有字符串。


事实证明,我可以假设所有的字符串都是“99999999”,因为它们都是形如“YYYYMMDD”的日期字符串。 - Ryan C. Thompson
1
使用undef是一件愚蠢的事情,因为当与字符串进行比较时会发出警告。 - ysth
我接受了这个答案,因为它是在不禁用警告或自己编写代码的情况下所能做到的最好的。 - Ryan C. Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接