字符串和数字产生不同的结果

时间:2018-01-11 18:02:07

标签: perl

#!/usr/bin/perl -T

use strict;
use warnings;

use Date::Holidays::USFederal;

if ( is_usfed_holiday( '2018', '01', '01' ) ) {    # strings
    print "holiday\n";
}
else {
    print "not holiday\n";
}

if ( is_usfed_holiday( 2018, 1, 1 ) ) {            # numbers
    print "holiday\n";
}
else {
    print "not holiday\n";
}

exit;

输出

not holiday
holiday

我认为Perl是一种基于上下文的语言,并且字符串在需要时自动用作数字。今天花了我一点调试时间。我不是专家,但这让我很困惑。

任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

is_usfed_holiday使用join($;, @_)作为哈希的关键字。因此,它使用字符串而不是其参数的数字。

解决方案:

is_usfed_holiday(0+$y, 0+$m, 0+$d)

is_usfed_holiday(map 0+$_, $y,$m,$d)

有人应与作者联系,提出以下问题:

  • is_usfed_holiday应该对其输入进行规范化,以避免遇到问题。
  • 该模块不应该依赖$;
  • 的现有值

此外,有些人可能会发现is_usfed_holiday的变体会使localtime(例如is_usfed_holiday_time(localtime))的结果变得有用。