有没有办法从inf
,-inf
而不是eval {1/0}
例外获取eval {1/-0}
或Illegal division by zero
?
答案 0 :(得分:4)
开箱即用?不,因为这是错误的答案。除以零是未定义不是无限的。
您可以使用//
之类的内容来测试eval
的结果是否未定义:
my $result = eval { 1/0 } // 'inf';
print $result;
并设置默认方式。 (虽然在上面,'inf'
是字符串;数值可能更有用)。有一些数学库可以为您提供inf
类型常量,例如bignum
bigrat
bigint
。但是可移植性可能是一个问题。
答案 1 :(得分:2)
如果您use bignum
,您inf
将获得1/0
:
use bignum;
print 1 / 0; # produces "inf"
1/-0
仍然是inf
(我猜是因为-0 == 0
)。
答案 2 :(得分:2)
你真正需要的是Data::Float:
#!/usr/bin/env perl
use strict;
use warnings;
use Carp qw( croak );
use Data::Float qw( have_infinite pos_infinity neg_infinity float_is_infinite);
have_infinite() or croak "No support for infinite float values";
my $v = -1;
my $x = 1;
my $y = 0;
my $z = eval { $x/$y };
unless (defined $z) {
$z = ($x >= 0) ? pos_infinity : neg_infinity;
}
print "$z\n";
$z = eval { $v/$y };
unless (defined $z) {
$z = ($v >= 0) ? pos_infinity : neg_infinity;
}
print "$z\n";
输出:
$ ./inf.pl Inf -Inf
当然,如果你使用5.10或更高版本,你可以这样做:
my $z = eval { $x/$y };
$z //= ($x >= 0) ? pos_infinity : neg_infinity;
print "$z\n";
$z = eval { $v/$y };
$z //= ($v >= 0) ? pos_infinity : neg_infinity;
print "$z\n";