![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
こんばんは。
いつもお世話になっております。
変数の中には、8桁の数字が入っています。
例えば、
$a = 20051130;
だったとして、この、$aをprintした時に
2005年11月30日 にしたいのです。
私なりに、色々しらべて、まず4個目と2個目と2個目
に/ を入れられたら、そこから発展させられるかしらと考えて、
$b = sprintf( "%04d/%02d/%02d", split("/",$_)) for $a;
にしてみたのですが、print $b;で出てきた結果は
20051130/00/00 でした……。
根本的になにか考え違いをしているのでしょうか…?
どうかご指導よろしくお願い申し上げます。
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で取り出すのがよいと思われます。
ご指導ありがとうございました。
丁寧な解説までして頂いて、私の何が悪かったのか
とてもわかりやすかったです。
もし、失礼でなかったら、もう一点教えて頂きたいのです。
最初に調べている段階でも疑問だったのですが、
\d とは、どういう意味を持っているのでしょうか…?
ためしに、aとかzなどを使ってみたのですが、
意図した結果は出てこないですし、dだけがちゃんと
結果が出てくるですよね…。
これは、丸暗記するべき事で、疑問に思う所ではない
のでしょうか…?
No.3
- 回答日時:
>\d とは、どういう意味を持っているのでしょうか…?
正規表現で「1文字の数字(0~9)」です。
そして、\d{n}は1文字の数字のn回繰り返し=n桁の数字です。
丸暗記までは必要ありませんが(かなり置くが深いので簡単に全てを理解し憶えるのは難しいです)、正規表現は頻繁にお世話になるのである程度は憶える事になると思います。
参考URL:http://www.rfs.jp/sitebuilder/perl/02/09.html
ご指導ありがとうございました。
やはり意味があったのですね。
本当に奥が深くて、覚えた端から忘れていく脳みそには
かなり辛い時が多々あります。
もう、勉強に使っている本なんて、山盛りの付箋で
付箋の意味が無くなってきている始末です(泣)
ご親切に、参考URLまで教えて頂き本当にありがとう
ございました。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
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となります。
ご指導ありがとうございます。
最終的にしたかった表示方は、年月日 で
区切りたかったのです。
なので、
$b = sprintf( "%04d年%02d月%02d日", $yyyy,$mm,$dd);
としてみた所、2005年11月30日 と表示できました!
ご指導、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
シェルスクリプトで、空白(ス...
-
pythonの*
-
16進の10進変換について
-
Perlにおける<?phpinfo();?>の...
-
perでメールが送信出来ない場合...
-
シェルで、ランダム関数を変数...
-
関数「exists」と「defined」の...
-
pythonで演算子を変数に代入す...
-
ソケットでのデータ送受信につ...
-
swift 文字コードから文字に変...
-
少数点以下の桁数について
-
10進数→2進数の出力について
-
MAXnum = input('最大数は?') f...
-
Application.ScreenUpdating = ...
-
この曲のピアノの最後の和音が...
-
<SELECT>タグの折り返し
-
文字の横にプルダウンを表示さ...
-
実行中の変数の中身をイミディ...
-
FindFirst を複数条件で検索
-
ACCESS テキストボックスを隙...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
python3について。
-
【至急!!!】python言語で本を見...
-
pythonで演算子を変数に代入す...
-
数値かどうかの判定方法
-
シェルスクリプトで、空白(ス...
-
UWSCのSELECT文の記述方法
-
関数「exists」と「defined」の...
-
文字のカラーとフォントの指定...
-
pythonの*
-
perでメールが送信出来ない場合...
-
チェックボックスのCGIへの値の...
-
変数の中は文字列か数値か調べ...
-
swift 文字コードから文字に変...
-
DBIがうんともすんとも言いませ...
-
switch文のエラーについて
-
c言語 16進数の2進数への変換
-
pythonを使ったプログラミング...
-
Python3
-
シェルスクリプト+perl
おすすめ情報