人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlで次の条件はどういう意味になりますか?
if (shift =~ /(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/) { $starttime = Time::Local::timelocal($6,$5,$4,$3,$2-1,$1); }

10進数で日付フォーマットか?という意味合いで使われているようなのですが、解釈のコツがつかめません。

●質問者: P-mako
●カテゴリ:インターネット ウェブ制作
✍キーワード:Perl TIME かめ フォーマット 解釈
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● openseed
●19ポイント

shift の戻り値は、暗黙で、

my $s = shift(@_);

とされたときの、$s の値と同じです。

// 厳密にはちょっと違いますが。

※ ファンクションの先頭行で実行されていますでしょうか? その場合は、呼び出し元の第一引数になります。


正規表現の説明は難しいですね。

まず、整数([0-9])で14桁であるとき、先頭の4文字を$1 で、次の2文字を$2 で ・・・ 参照できるようになります。

仮に、shift の値が "20060213123456" とすると、

$1 = 56

$2 = 34

$3 = 12

$4 = 13

$5 = 02

$6 = 2006

になります。

なので、日付のフォーマットチェックは、行われず、数値14桁である条件だけで、1970年1月1日0時0分0秒からの経過秒に変換しようとしています。

※ たとえば、99999999999999 が入力されても、$starttime には値が代入されると思います。


説明になっていないかもしれませんが、参考まで。

※ URLは「shift, timelocal」で検索した1件目です。

timelocal:

http://cocohome.hp.infoseek.co.jp/cocohome/l_nisukeisan.html

shift:

http://www.rfs.jp/sb/perl/05/shift.html

◎質問者からの返答

ご回答ありがとうございます。

非常にわかりやすい説明でした。

~(チルダ)の意味ってなんでしょうか?

Cや類似言語では否定だったと思いますし、

+=や-=、^=(XOR+イコール)、もっといえば

~=(NOT+イコール)ならわかる気がするんですが、

=~ってどういう意味なんでしょう?


2 ● k-onishi
●19ポイント

shift(引数の最初のひとつを取り出したもの)に、

12桁の数字(\d)が含まれていれば、

最初の4桁とその後の2桁5つに分けて($1?$6に代入)、

Time::Local::timelocalの引数とし、

結果を $starttime に代入する

ということですね。


たぶん引数が年月日時分秒の12桁の数字になっていれば、

その値を内部時間に変換し $starttime に入力するものと思います。

http://q.hatena.ne.jp/1171356544

◎質問者からの返答

ご回答ありがとうございました。


3 ● huruyosi
●19ポイント

http://cocohome.hp.infoseek.co.jp/perl_ref/localtime.html

Time::Local::timelocalの説明はこちらをご参照ください。


正規表現の「\d」は数字を表し括弧でグループ化して、$1?$6の部分で取り出しています。これを踏まえると

(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)

4文字の数字 -> $1

2文字の数字 -> $2

2文字の数字 -> $3

2文字の数字 -> $4

2文字の数字 -> $5

2文字の数字 -> $6

と解釈できます。たとえば変数shift の値が「2007年1月13日 21時22分18秒」を表す「20070113212218」だとすると

2007 -> $1

01 -> $2

13 -> $3

21 -> $4

22 -> $5

18 -> $6

になります。


文字列を年月日、時分秒に分解した後に時間を表すクラスに変換しています。

◎質問者からの返答

ご回答ありがとうございました。


4 ● nev
●19ポイント

shift は shift @_ の意味なので、

その箇所がサブルーチンの一部であれば、先頭の引数を返します。

$1,$2 ... $6 は、正規表現内のカッコに相当する部分が入ります。

YYYYMMDDhhmmss 形式の 10 進数の文字列が渡されたとしたら、

YYYY の部分が $1 に、

MM の部分が $2 に、

...

ss の部分が $6 に、それぞれ入ることになります。

http://q.hatena.ne.jp/1171356544


◎質問者からの返答

ご回答ありがとうございました。


5 ● openseed
●18ポイント

すみません。逆でした。

以下が正しいです。

shift = 20060213123456; のとき、
$0 = 20060213123456
$1 = 2006
$2 = 02
$3 = 13
$4 = 12
$5 = 34
$6 = 56

nev さんのように、 YYYYMMDDhhssmm と表現するほうが、分かりやすいかもしれませんね。

=~ についてですが・・・、詳しくは答えられませんが、正規表現など、置換やパターンマッチングを行うときの演算子として利用しています。

http://perldoc.jp/docs/perl/5.6.1/perlop.pod

Binding Operators の項目


基本的に、= が後に来るのは、演算後の代入だと認識しています。

※ =~ で置換もできるから、必ずしも断言できないのですが・・・

参考になれば幸いです。

◎質問者からの返答

> 基本的に、= が後に来るのは、演算後の代入だと認識しています。

++$i

とかと同じってことですね。

+=も同様に=+があったんでしたっけ・・・

ありがとうございました。

でも、いまひとつ解釈のコツとしてはクリアになっていないです・・・

たとえば、

$i++や$i+=1

なら、

$i=$i+1

がわかりやすくて、厳密(?)な記述になると思います。

では、質問の条件式は、どうなるんでしょう?(という質問文のほうが良かったかも知れないですね。)


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ