Perl,字符串,浮点数,单元测试和regexps!

Chr*_*s R 5 perl

好吧,作为序言,这个问题可能比我正常的问题更"愚蠢" - 但是这个问题在过去的几天一直让我讨厌,所以无论如何我都会问它.我将举例说明我的问题是什么,所以我希望将其概括为我当前的问题.

#!/usr/bin/perl -w use strict;

use Test::More 'no_plan';

my $fruit_string = 'Apples cost $1.50';
my ($fruit, $price) = $fruit_string =~ /(\w+)s cost \$(\d+\.\d+)/;

# $price += 0; # Uncomment for Great Success
is ($price, 1.50, 'Great Success');
Run Code Online (Sandbox Code Playgroud)

现在,当这个运行时,我得到了消息

#   Failed test 'Great Success'
#          got: '1.50'
#     expected: '1.5'
Run Code Online (Sandbox Code Playgroud)

为了使测试工作 - 我要么取消注释注释行,要么使用is ($price, '1.50', 'Great Success').这两个选项对我都不起作用 - 我正在使用Test :: Deep和cmp_deeply测试大量嵌套数据.我的问题是,如何从正则表达式中提取双精度然后立即将它作为双精度使用 - 或者如果有更好的方法让我知道 - 并随意告诉我从事园艺或其他事情,学习Perl是硬.

Eth*_*her 10

您已经在使用Test :: Deep,因此您可以简单地使用num()包装器来执行数字而不是逐字符串比较(它甚至允许您添加公差,以比较两个不精确的浮点值):

cmp_deeply(
    $result,
    {
        foo         => 'foo',
        bar         => 'blah',
        quantity    => 3,
        price       => num(1.5),
    },
    'result hash is correct',
);
Run Code Online (Sandbox Code Playgroud)

对于单独进行的正常比较,cmp_ok将起作用,但num()仍然可用:cmp_deeply($value, num(1.5), 'test name')仍然有效.