パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

動的型付けとsprintfの合わせ技」記事へのコメント

  • Perlは基本的に『うまいことやってくれる』言語なので、ほとんどの場合、
    明示的にマイナスつけてないなら正の数なんだろう、みたいに扱ってくれて、
    整数の符号付き符号なしを意識しなくてもなんとかなっちゃうんですが、

    printfに関しては『C言語のprintfと同じ仕様』と決まっていて、
    %uと%dで、明示的に符号のありなしを区別する仕様になってるので、
    %dと書かれてる以上は、符号付きと解釈するしかない。

    普段うまいことやってくれてるのに、そうじゃないものが時々混ざってる。
    というPerlのつぎはぎ仕様の悪い側面じゃないかな、と思ったりします。

    • by route127 (38618) on 2020年01月06日 23時37分 (#3741290) 日記

      >『うまいことやってくれる』
      最初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     -2060399406
      perl5.16 %ld     -2060399406
      perl5.16 %lld     %lld(受付けない)

      perl5.24 %d      2234567890
      perl5.24 %ld     -2060399406
      perl5.24 %lld      2234567890

      となり、5.24でも長さ修飾子を適宜選択することで5.16の挙動を再現可能であった。

      %lld絡みではvim周りでも似たような話 [github.com]があったらしい。

      まあ確かにC言語(というよりPOSIXか)の知識が必要なことはちょくちょくあって、例えばPerlでTime::PieceのPOD [perldoc.jp]では網羅されてないstrptimeの書式指定子 [linuxjm.osdn.jp]なんかを調べたりした覚えがある。

      そういう低レベルPerlバッドノウハウ集とかないのだろうか。
      いやむしろそういうのは集めちゃいけない忘れるべき禁忌なのかもだ。

      親コメント

日々是ハック也 -- あるハードコアバイナリアン

処理中...