2010-08-30 62 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