2010-08-30 61 views
3

在Perl中,为了进行数字比较,我们有+/- inf作为大于/小于每隔一个数字的数字。是否还有字符串是gt/lt任何其他字符串?Perl的字符串比较有相当于+/-无穷大吗?

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

+1

见http://stackoverflow.com/questions/3258248/ – 2010-08-30 04:28:53

+0

基于该链接,我想我可以写重载比较功能模块做时使用任何字符串比我想要的答案。但在实践中,我意识到我唯一比较的是日期字符串形式为'YYYYMMDD',所以我的“无限”字符串是“”99999999“'。不过,我有点想写模块。 – 2010-08-30 04:38:32

+1

显然无穷大等于99999999.谁知道? – 2010-08-30 04:41:01

回答

2

空字符串或undef小于每个其他字符串。

没有比任何其他字符串都大的有限字符串。但是如果你可以像循环中的所有字符串那样做一些假设是ASCII字符串,那么你可以指定一个像“\ x80”(ASCII值为128)的字符串,它比所有的字符串都要大。

+0

嗯,事实证明,我可以认为我的所有字符串都是“le” 99999999“,因为它们都是'YYYYMMDD'形式的日期字符串。 – 2010-08-30 04:39:21

+1

undef是一个愚蠢的东西使用,因为它会警告当与字符串比较。 – ysth 2010-08-30 05:36:32

+0

我接受了这个答案,因为这是最好的,你可以做到不禁止警告或自己写。 – 2010-08-31 02:47:41

4

否但""将小于或等于任何其他字符串,并且chr(〜0)重复足够的次数将大于或等于该长度或更少的任何字符串。 (假设不使用经由“使用区域”的基于地区的排序规则。)

(CHR(〜0)将需要no warnings 'utf8',因为它不是在限定的UTF8字符的范围。)

+0

什么是“chr(〜0)”? – 2010-08-30 04:39:40

+0

@Ryan Thompson:〜0是人们称赞的0,perl将使用的最大整数(因此也是最大字符的序数值)。在32位perls上,它将是64位perls chr(18446744073709551615)上的chr(4294967295)。 – ysth 2010-08-30 05:34:39

+0

你根本不需要重复'chr(〜0)'。由于它不是一个有效的代码点,它不应该出现在程序中的任何实际数据字符串中。 – cjm 2010-08-30 05:51:43

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; 
+0

为什么?因为我还没有足够的perl导师来写经验超载的经验。虽然这很整齐。 – 2010-08-31 02:45:38