18

我是 perl 的新手,正在寻找@array. 是否有一些常数代表一个非常大的整数?

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

4

6 回答 6

30

要回答您实际提出的问题(即使它对您并没有真正用处):

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

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

    say ~0;
    
  3. 从 0 到该数字的所有整数值都可以作为浮点数无损失地存储。

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

    请注意,一些较大的整数可以存储在浮点数中而不会丢失,但不能存储比这大 1 的整数。

于 2013-02-28T10:58:09.740 回答
21

在一般情况下,您可以使用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;
于 2013-02-28T05:30:16.387 回答
4

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

于 2013-02-28T05:34:29.687 回答
2

Perl 不是 C;如果您尝试计算一个太大的整数,则会得到一个浮点结果(除非 you 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表示浮点(数字?)值。

您绝对应该使用适合您目的的工具,而不是模糊的 hack;List::Util::min正如另一个答案中提到的那样非常好。只是想你可能想确认你原来的问题:)

于 2013-02-28T05:47:11.530 回答
0

这里:http ://www.perlmonks.org/?node_id=718414

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

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

于 2014-11-25T14:38:30.207 回答
-2

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

我不知道是否有专门针对此的常数。

于 2013-02-28T05:25:45.940 回答