什么是MAX_INT的perl等价物?

时间:2013-02-28 05:14:03

标签: arrays perl constants built-in

我是perl的新手并且在@array中寻找最低价值。是否有一些常量代表一个非常大的整数?

我知道我可以对数组进行排序并从头开始,但这似乎是浪费了很多CPU周期。在Perl中我的问题的优雅解决方案是什么?

6 个答案:

答案 0 :(得分:24)

要回答你实际问过的问题(即使它对你没用):

  1. 可以存储为有符号整数的最大整数值。

    say ~0 >> 1;
    
  2. 可以存储为无符号整数的最大整数值。

    say ~0;
    
  3. 从0到此数字的所有整数值都可以作为浮点数存储而不会丢失。

    use Config qw( %Config );
    say eval($Config{nv_overflows_integers_at});
    

    请注意,某些较大的整数可以在浮点数中存储而不会丢失,但不会高于此值。

答案 1 :(得分:18)

在一般情况下,您可以使用undef来表示不存在的值; perl标量不仅限于整数。那将写成:

my $min; # undef by default
for my $value (@array) {
  $min = $value if !defined $min or $value < $min;
}

但这里有一些更简单的选择。例如,将$min初始化为数组中的第一个值,然后与其余值进行比较:

my $min = $array[0];
for my $i (1 .. $#array) {
  $min = $array[$i] if $array[$i] < $min;
}

或者只使用内置功能:

use List::Util 'min';
my $min = min @array;

答案 2 :(得分:3)

9**9**9有效。在perl的许多版本/平台上0+'inf'也是如此。

答案 3 :(得分:2)

Perl不是C;如果你试图计算一个太大的整数,你会得到一个浮点结果(除非你use bigint,这使得整数无界限)。除此之外,你得到inf

您可以使用Devel::Peek看到这一点,它会显示Perl内部的值表示:

$ perl -E 'use Devel::Peek; Dump(1000); Dump(1000**100); Dump(1000**100 + 1)'
SV = IV(0xcdf290) at 0xcdf2a0
  REFCNT = 1
  FLAGS = (PADTMP,IOK,READONLY,pIOK)
  IV = 1000
SV = NV(0xd04f20) at 0xcdf258
  REFCNT = 1
  FLAGS = (PADTMP,NOK,READONLY,pNOK)
  NV = 1e+300
SV = NV(0xd04f18) at 0xcdf228
  REFCNT = 1
  FLAGS = (PADTMP,NOK,READONLY,pNOK)
  NV = 1e+300

IV表示整数值; NV表示浮点(数字?)值。

你绝对应该使用适合你目的的工具而不是模糊的黑客;另一个答案中提到的List::Util::min非常好。只是觉得你可能想要确认原来的问题:)

答案 4 :(得分:0)

此处:http://www.perlmonks.org/?node_id=718414

我得到了一个可以在linux 64上验证的答案

18,446,744,073,709,551,615 =(2 ^ 64)-1

答案 5 :(得分:-3)

perl可以存储的最大整数值是9,007,199,254,740,992

我不知道是否有特定的常数。

相关问题