アカウント名:
パスワード:
Perlは基本的に『うまいことやってくれる』言語なので、ほとんどの場合、明示的にマイナスつけてないなら正の数なんだろう、みたいに扱ってくれて、整数の符号付き符号なしを意識しなくてもなんとかなっちゃうんですが、
printfに関しては『C言語のprintfと同じ仕様』と決まっていて、%uと%dで、明示的に符号のありなしを区別する仕様になってるので、%dと書かれてる以上は、符号付きと解釈するしかない。
普段うまいことやってくれてるのに、そうじゃないものが時々混ざってる。というPerlのつぎはぎ仕様の悪い側面じゃないかな、と思ったりします。
>『うまいことやってくれる』最初bignumとか使えばうまく行くんじゃないかと思ったけどそうでもなくて結局書式指定子の仕様確かめなくちゃいけないのはうまくないような気はする…。Perl6(Raku)も書式指定子周り [perl6.org]はあまり変わらないのか。
>printfに関しては『C言語のprintfと同じ仕様』と決まっていて、なんかPerlも処理系依存でC言語の規格にどの程度追随してるのかまちまちな気がする。perl5.16だとsprintfの仕様 [perldoc.jp]通り、%ld(%D)までしか受付けないものの、perl5.24にだとC99仕様のprintfの書式指定子 [linuxjm.osdn.jp]にある程度対応しているようで、書式指定子として%lld [wdic.org]を受け付けるんですよね。この辺、Perl側でドキュメント化がされてるのか確認出来ていないが丹念にperldelta見ていけばどこかに書いてあるのかも。
ひとまず整理すると(左列から処理系ver.、書式指定子、印字)、
perl5.16 %d -2060399406perl5.16 %ld -2060399406perl5.16 %lld %lld(受付けない)perl5.24 %d 2234567890perl5.24 %ld -2060399406perl5.24 %lld 2234567890
perl5.16 %d -2060399406perl5.16 %ld -2060399406perl5.16 %lld %lld(受付けない)
perl5.24 %d 2234567890perl5.24 %ld -2060399406perl5.24 %lld 2234567890
となり、5.24でも長さ修飾子を適宜選択することで5.16の挙動を再現可能であった。
%lld絡みではvim周りでも似たような話 [github.com]があったらしい。
まあ確かにC言語(というよりPOSIXか)の知識が必要なことはちょくちょくあって、例えばPerlでTime::PieceのPOD [perldoc.jp]では網羅されてないstrptimeの書式指定子 [linuxjm.osdn.jp]なんかを調べたりした覚えがある。
そういう低レベルPerlバッドノウハウ集とかないのだろうか。いやむしろそういうのは集めちゃいけない忘れるべき禁忌なのかもだ。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
日々是ハック也 -- あるハードコアバイナリアン
Perl (スコア:1)
Perlは基本的に『うまいことやってくれる』言語なので、ほとんどの場合、
明示的にマイナスつけてないなら正の数なんだろう、みたいに扱ってくれて、
整数の符号付き符号なしを意識しなくてもなんとかなっちゃうんですが、
printfに関しては『C言語のprintfと同じ仕様』と決まっていて、
%uと%dで、明示的に符号のありなしを区別する仕様になってるので、
%dと書かれてる以上は、符号付きと解釈するしかない。
普段うまいことやってくれてるのに、そうじゃないものが時々混ざってる。
というPerlのつぎはぎ仕様の悪い側面じゃないかな、と思ったりします。
Re:Perl (スコア:1)
>『うまいことやってくれる』
最初bignumとか使えばうまく行くんじゃないかと思ったけどそうでもなくて結局書式指定子の仕様確かめなくちゃいけないのはうまくないような気はする…。
Perl6(Raku)も書式指定子周り [perl6.org]はあまり変わらないのか。
>printfに関しては『C言語のprintfと同じ仕様』と決まっていて、
なんかPerlも処理系依存でC言語の規格にどの程度追随してるのかまちまちな気がする。
perl5.16だとsprintfの仕様 [perldoc.jp]通り、%ld(%D)までしか受付けないものの、perl5.24にだとC99仕様のprintfの書式指定子 [linuxjm.osdn.jp]にある程度対応しているようで、書式指定子として%lld [wdic.org]を受け付けるんですよね。
この辺、Perl側でドキュメント化がされてるのか確認出来ていないが丹念にperldelta見ていけばどこかに書いてあるのかも。
ひとまず整理すると(左列から処理系ver.、書式指定子、印字)、
となり、5.24でも長さ修飾子を適宜選択することで5.16の挙動を再現可能であった。
%lld絡みではvim周りでも似たような話 [github.com]があったらしい。
まあ確かにC言語(というよりPOSIXか)の知識が必要なことはちょくちょくあって、例えばPerlでTime::PieceのPOD [perldoc.jp]では網羅されてないstrptimeの書式指定子 [linuxjm.osdn.jp]なんかを調べたりした覚えがある。
そういう低レベルPerlバッドノウハウ集とかないのだろうか。
いやむしろそういうのは集めちゃいけない忘れるべき禁忌なのかもだ。