• ベストアンサー

変数の中の数値を年月日付きに変えたいです。

こんばんは。 いつもお世話になっております。 変数の中には、8桁の数字が入っています。 例えば、 $a = 20051130; だったとして、この、$aをprintした時に 2005年11月30日 にしたいのです。 私なりに、色々しらべて、まず4個目と2個目と2個目 に/ を入れられたら、そこから発展させられるかしらと考えて、 $b = sprintf( "%04d/%02d/%02d", split("/",$_)) for $a; にしてみたのですが、print $b;で出てきた結果は 20051130/00/00 でした……。 根本的になにか考え違いをしているのでしょうか…? どうかご指導よろしくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • SHOO-3
  • ベストアンサー率56% (28/50)
回答No.2

20051130 の数字を、 2005/11/30 とするためのやり方でよろしいでしょうか?(間違ってたらすみません。) $a = 20051130; ($b = $a) =~ s/(\d{4})(\d{2})(\d{2})/$1\/$2\/$3/; とすればおそらく思い通りの動作をすると思います。 あなたのスクリプトですが、二つほど変な部分があります。 一つ目として、for文の使い方があまりよくありません。 forでは、ひとつの要素を持つ配列を、foreach文と同じ役割をするように使っています。 これにはあまり意味がありません。素直に$aを使ったほうがよいと思います。 二つ目として、その後、 sprintf( "%04d/%02d/%02d", split("/",$_)) としていますが、この時点で $_ (=$a) には 20051130 が入っているものとして解釈されます。 つまり、これを"/"でsplitしても、区切るところがない状態になっています。 なので、sprintfでは、 sprintf("%04d/%02d/%02d", 20051130); としているものと同じ動作をすることになります。 引数が2つだけなので、2個目と3個目の%02dではundef(初期化されていない値)を解釈したものとして、無理やり00が挿入されているわけです。 この場合は、splitで分解するよりも、正規表現か、あるいはsubstrで取り出すのがよいと思われます。

sibazuke
質問者

お礼

ご指導ありがとうございました。 丁寧な解説までして頂いて、私の何が悪かったのか とてもわかりやすかったです。 もし、失礼でなかったら、もう一点教えて頂きたいのです。 最初に調べている段階でも疑問だったのですが、 \d とは、どういう意味を持っているのでしょうか…? ためしに、aとかzなどを使ってみたのですが、 意図した結果は出てこないですし、dだけがちゃんと 結果が出てくるですよね…。 これは、丸暗記するべき事で、疑問に思う所ではない のでしょうか…?

その他の回答 (2)

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.3

>\d とは、どういう意味を持っているのでしょうか…? 正規表現で「1文字の数字(0~9)」です。 そして、\d{n}は1文字の数字のn回繰り返し=n桁の数字です。 丸暗記までは必要ありませんが(かなり置くが深いので簡単に全てを理解し憶えるのは難しいです)、正規表現は頻繁にお世話になるのである程度は憶える事になると思います。

参考URL:
http://www.rfs.jp/sitebuilder/perl/02/09.html
sibazuke
質問者

お礼

ご指導ありがとうございました。 やはり意味があったのですね。 本当に奥が深くて、覚えた端から忘れていく脳みそには かなり辛い時が多々あります。 もう、勉強に使っている本なんて、山盛りの付箋で 付箋の意味が無くなってきている始末です(泣) ご親切に、参考URLまで教えて頂き本当にありがとう ございました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

以下のようにされてはいかがでしょうか。 -------------------------- $a = 20051130; $yyyy = int($a / 10000); $mm = int(($a % 10000)/100); $dd = $a % 100; $b = sprintf( "%04d/%02d/%02d", $yyyy,$mm,$dd); print $b; $bの内容は2005/11/30となります。

sibazuke
質問者

お礼

ご指導ありがとうございます。 最終的にしたかった表示方は、年月日 で 区切りたかったのです。 なので、 $b = sprintf( "%04d年%02d月%02d日", $yyyy,$mm,$dd); としてみた所、2005年11月30日 と表示できました! ご指導、ありがとうございました。

関連するQ&A