tokuhirom's Blog

perl 5.21.1+ で POSIX.pm が C99 functions を default で export する問題。

https://github.com/yappo/p5-Geo-Coordinates-Converter/pull/1

Perl 5.21.1+ だと思うんだけど、POSIX.pm が C99 functions をサポートしていて、さらにそれを default で export してくる。具体的には round() とかそのへん。

具体的には以下のものね。

                   'strtold', # platform varying (C99)

                    # C99 math
                    qw/acosh asinh atanh cbrt copysign cosh erf
                    erfc exp2 expm1 fdim fma fmax fmin fpclassify
                    hypot ilogb isfinite isgreater isgreaterequal
                    isinf isless islessequal islessgreater isnan
                    isnormal isunordered j0 j1 jn lgamma log1p
                    log2 logb nan nearbyint nextafter nexttoward
                    remainder remquo rint round scalbn signbit
                    sinh tanh tgamma trunc y0 y1 yn/,

https://github.com/Perl/perl5/commit/7965edec715460c994530f0ab3803b5845c15d7b#diff-08dc17f086c8dfcda1469a5d1ab1ad41

で、round() とかって極めて一般的な名前だから、急に export するようになるとかぶって阿鼻叫喚になるって可能性もあるよね。

だから、ちょっとデフォルトで追加されたやつ常に export するのやめたほうがいいんじゃないの?ってメールしてみた。

https://rt.perl.org/Ticket/Display.html?id=124446

実際これが Geo::Coordinates::Converter で問題になっていて、

package Geo::Coordinates::Converter::Format;
sub round { $_[1] }

package Geo::Coordinates::Converter::Format::ISO6709;
use POSIX;

みたいなコードがあって、これが以前と挙動が違っている。

とりあえず p-r は出したけど。 https://github.com/yappo/p5-Geo-Coordinates-Converter/pull/1

もちろん、use POSIX; と書くのは危険だからやめよう! っていうのはわりとよく知られたプラクティスではあるのだが、まあやっぱりハマる人おおそうだし、一応コア側にそういうふうに思ってる人もいるんですよ、というメールは送っておいたってわけ。