とあるディレクトリにmh形式で保存されているメールがあり,それらから
特定のヘッダを持つメールを抽出し,日付順にソートして,他ディレクト
リにファイル名を 1から並べ直してコピーする perl scriptを書いている
ところです.
その中で,日付順にソートする際,(RFCで定められているのか知りません
が) メールのDate: ヘッダのフォーマットは
Date: 曜日, 日付 月(文字列) 西暦 時間 時差
となっているようで,このままで sort を使っても意味がないので,これ
を置換して
西暦 月(数値) 日付 時間
と並び替えるサブルーチンを以下のように作りました.これはもっとスマ
ートにならないもんでしょうか.あるいは日付のソートを行う,根本的に
異なる方法があったりするのでしょうか.情報をお寄せ頂ければ幸いです.
sub Dateconv {
$month = $_[0];
# いらない情報は削る.
$month =~ s/^Date: [a-zA-Z]+, (.*) \+[0-9]+$/$1/;
# 一桁の日付は0でパディング
$month =~ s/^([0-9])\ /0$1 /;
# 文字の月表現を数値に変換
$month =~ tr/[A-Z]/[a-z]/;
$month =~ s/jan/01/;
$month =~ s/feb/02/;
$month =~ s/mar/03/;
$month =~ s/apr/04/;
$month =~ s/may/05/;
$month =~ s/jun/06/;
$month =~ s/jul/07/;
$month =~ s/aug/08/;
$month =~ s/sep/09/;
$month =~ s/oct/10/;
$month =~ s/nov/11/;
$month =~ s/dec/12/;
# 西暦 月 日付 時間の順に並び替え.
$month =~ s/^([0-9]+) ([0-9]+) ([0-9]+) ([0-9:]+)\n/$3 $2 $1 $4/;
return ($month);
}
--
柏崎 礼生 : Hiroki Kashiwazaki
Division of Research & Development Takai Laboratory
Computing Center, Hokkaido University, Japan
mailto:r...@cc.hokudai.ac.jp
Tel:+81-11-706-2998
ヘッダの"Date:"部分や、月の名前などは大文字だったり小文字
だったりすることもあるのかなー、タイムゾーンはマイナスも
あるんじゃないかなー、などと突っ込みたくなりますが、まあ、
敢えてこの方式でやれば、
%month_name = (
'jan' => '01', 'feb' => '02', 'mar' => '03', 'apr' => '04',
'may' => '05', 'jun' => '06', 'jul' => '07', 'aug' => '08',
'sep' => '09', 'oct' => '10', 'nov' => '11', 'dec' => '12'
);
$month =~ s/^date: \w+,( \d+) (\w{3}) (\d+ )([\d:]+).*$/$3.$month_name{lc($2)}.$1.' '.$4/ie;
こんな感じでしょうか。でも、本当はタイムゾーンをちゃんと
考慮しないと正しい時刻比較にならないんじゃ...
まあ、自力でやるより、モジュール使った方がいいですね。
http://www.perldoc.com/cpan/Date/Parse.html
標準ではついていないみたいですが。
> とあるディレクトリにmh形式で保存されているメールがあり,それらから
> 特定のヘッダを持つメールを抽出し,日付順にソートして,他ディレクト
> リにファイル名を 1から並べ直してコピーする perl scriptを書いている
> ところです.
pick して refile -link して sortm でできちゃうような気もしますが…
#これでは perl とは関係なくなっちゃいますね。
> その中で,日付順にソートする際,(RFCで定められているのか知りません
> が) メールのDate: ヘッダのフォーマットは
>
> Date: 曜日, 日付 月(文字列) 西暦 時間 時差
>
> となっているようで,このままで sort を使っても意味がないので,これ
> を置換して
>
> 西暦 月(数値) 日付 時間
>
> と並び替えるサブルーチンを以下のように作りました.これはもっとスマ
> ートにならないもんでしょうか.あるいは日付のソートを行う,根本的に
> 異なる方法があったりするのでしょうか.情報をお寄せ頂ければ幸いです.
日付、月、西暦、時間 を切り出したならば、Time::Local で time_t に変換し
てソートするとかでしょうか。
--
うがい@厚木.ソニー
ug...@vsp.cpg.sony.co.jp
In article <87bs4v...@genki00.cc.hokudai.ac.jp>, Hiroki Kashiwazaki <r...@cc.hokudai.ac.jp> writes
>とあるディレクトリにmh形式で保存されているメールがあり,それらから
>特定のヘッダを持つメールを抽出し,日付順にソートして,他ディレクト
>リにファイル名を 1から並べ直してコピーする perl scriptを書いている
>ところです.
mh なんだから MH 使えばいいのに。
pick --header xx -sequence mm
refile -link mm +tmp
sortm +tmp
それではいけないんでしょうか? もしかして、packf されてる? だったら、
msh 経由でおなじことができます。MH って便利~
>Date: 曜日, 日付 月(文字列) 西暦 時間 時差
>となっているようで,このままで sort を使っても意味がない
そうだよね。
Time::Local
モジュールが近いことをやってくれるんですが... 時差は見てくれないです。
さして長くないので、こいつを書き直すのが良いかも。
---
Shinji KONO @ Information Engineering, University of the Ryukyus,
PRESTO, Japan Science and Technology Corporation
河野真治 @ 琉球大学工学部情報工学科,
科学技術振興事業団さきがけ研究21(機能と構成)
At Tue, 12 Nov 2002 20:15:17 +0900,
Masaoki Kobayashi wrote:
> ヘッダの"Date:"部分や、月の名前などは大文字だったり小文字
> だったりすることもあるのかなー、タイムゾーンはマイナスも
> あるんじゃないかなー、などと突っ込みたくなりますが、
うう,突っ込みどころ満載なところ恥を承知で投稿しました….
> 敢えてこの方式でやれば、
>
> %month_name = (
> 'jan' => '01', 'feb' => '02', 'mar' => '03', 'apr' => '04',
> 'may' => '05', 'jun' => '06', 'jul' => '07', 'aug' => '08',
> 'sep' => '09', 'oct' => '10', 'nov' => '11', 'dec' => '12'
> );
> $month =~ s/^date: \w+,( \d+) (\w{3}) (\d+ )([\d:]+).*$/$3.$month_name{lc($2)}.$1.' '.$4/ie;
これは簡潔ですね.なるほど.知らない使い方が沢山です.とりあえず
$month_name{lc($2) の lc が分からないので調べなければ.
> こんな感じでしょうか。でも、本当はタイムゾーンをちゃんと
> 考慮しないと正しい時刻比較にならないんじゃ...
時差の項目を適切に取り出して時刻に加減する,という方法で良いので
しょうか ? 日付の変更とかも盛り込んで.
> まあ、自力でやるより、モジュール使った方がいいですね。
>
> http://www.perldoc.com/cpan/Date/Parse.html
なるほど.こんなものがあったとは.
At Tue, 12 Nov 2002 20:21:17 +0900,
Takeo Ugai wrote:
> pick して refile -link して sortm でできちゃうような気もしますが…
> #これでは perl とは関係なくなっちゃいますね。
あ,別に perl でなくても問題はないので,そういう解法も寄せて頂け
ますと非常に勉強になります.
ちなみに先日友人と協力して grep, awk, sed などを使って
grep "^To: hogehoge" * |\
awk -F':' '{printf("echo -n \"%d \" ; grep "^Date:\" %d ;\n",$1,$1);}' |\
sh |\
awk -F' ' '{printf("%s %s %02s %s %3s\n",$6,$5,$4,$7,$1);}' |\
sed 's/Jan/01/'|sed 's/Feb/02/'|sed 's/Mar/03/'|sed 's/Apr/04/'|\
sed 's/May/05/'|sed 's/Jun/06/'|sed 's/Jul/07/'|sed 's/Aug/08/'|\
sed 's/Sep/09/'|sed 's/Oct/10/'|sed 's/Nov/11/'|sed 's/Dec/12/'|\
sort|\
awk -F' ' '{print $5;}' |\
sed 's/^/cp /' |\
cat -n|\
awk -F' ' '{printf("%s %s %s/%s\n",$2,$3,"hoge",$1);}'|sh
という一行コマンドを作り上げましたが,気が狂いそうになりました.
> 日付、月、西暦、時間 を切り出したならば、Time::Local で time_t に変換し
> てソートするとかでしょうか。
なるほど.こちらも試してみます.
At 12 Nov 2002 20:20:26 +0900,
Shinji KONO wrote:
> mh なんだから MH 使えばいいのに。
>
> pick --header xx -sequence mm
> refile -link mm +tmp
> sortm +tmp
これがうがい氏が言っていたもののそのものですね.なるほど.
> そうだよね。
> Time::Local
> モジュールが近いことをやってくれるんですが... 時差は見てくれないです。
> さして長くないので、こいつを書き直すのが良いかも。
ちなみに余談ですが,perldoc.com で Time::Local について Perl5.8 を
対象に検索すると全くヒットしませんが (5.6ではヒットする) 今後はTime::
Local に代わる何かを使うべきという事なんでしょうか ?
よく「スマートな方法」という言い方を聞きますよね。「つくってみたんで
すが、もっとスマートな方法はありませんか」という質問ってよくあります。
でももう出来てるわけでしょう? 目的は達成されてるんですよね? でしたら
はたして意味があることなんでしょうか?
いえべつにダメだとか批判してるわけじゃなくて、あまりに濫用されてるの
ではないかなあという気がして…。本筋とは関係ないレスでした。
NST
In article <2002111221555...@nospams.gmx.net>, NOSOT <tem...@nospams.gmx.net> writes
> よく「スマートな方法」という言い方を聞きますよね。「つくってみたんで
>すが、もっとスマートな方法はありませんか」という質問ってよくあります。
>でももう出来てるわけでしょう? 目的は達成されてるんですよね? でしたら
>はたして意味があることなんでしょうか?
そういう人は、「プログラミング作法」「プログラミング書法」を
読むべきだな...
僕は、プログラミングに関しては常に「もっとスマートな方法はないか」
と考えることが上達の道だと思っています。
> これはもっとスマートにならないもんでしょうか.
NetNews のソフトウェアは、history 作んないといけないので、Date: に書か
れた文字列から epoch time を作る機構をたいてい持っているはずです。
inn では lib/parsedate.y が、それに該当します。
参考に…ならないかも。
--
池田研二 稲城駅前在住
> NOSOT <tem...@nospams.gmx.net> さん
プログラムに置いて、スマートの方法を求めたり、楽をしたり(妥協って事ではあり
ません)することが出きる人は、優れたプログラムを作れるようになります。
職業で時間を気にしながら作っているならともかく、趣味で作っているのだとしたら
、どれだけ時間掛けたって、経験が増えるだけだと思いますが...。
よりよい方法を求めていろいろと勉強することで、また新たな手法を見つけることも
ありますし...。
# 特にPerlは。
# TMTOWTDIの精神で!
// Hiroaki,Sakuma
//
// BEETAS.org http://www.beetas.org/
// sak...@beetas.org
//
// Webmin-JP http://jp.webmin.com/
// sak...@jp.webmin.com
"There's More Than One Way To Do It"
NOSOTさんの<2002111221555...@nospams.gmx.net>から
> よく「スマートな方法」という言い方を聞きますよね。「つくってみたんで
>すが、もっとスマートな方法はありませんか」という質問ってよくあります。
>でももう出来てるわけでしょう? 目的は達成されてるんですよね? でしたら
>はたして意味があることなんでしょうか?
1回きりなプログラムであれば「スマートな方法」でなくてもそんなに困
らないのは確かです。
ですが、作って終わりのプログラムってのはあんまり無くて、あとから機
能を付け足したり、改良したりすることが多いんです。そんなときスマー
トでない方法をとっていると、あとから見た時、非常にわかりにくかった
り、変更しにくかったりしてよろしくない…。
「スマートな方法」にするってのは十分に意味があることなんですよ。
--
Tanaka-Qtaro-Yasuhiro mailto:ta...@ca2.so-net.ne.jp
<aqv9oj$s2q$1...@nn-os104.ocn.ad.jp>の記事において
ta...@ca2.so-net.ne.jpさんは書きました。
> NOSOTさんの<2002111221555...@nospams.gmx.net>から
> > よく「スマートな方法」という言い方を聞きますよね。「つくってみたんで
> >すが、もっとスマートな方法はありませんか」という質問ってよくあります。
> >でももう出来てるわけでしょう? 目的は達成されてるんですよね? でしたら
> >はたして意味があることなんでしょうか?
>
> 1回きりなプログラムであれば「スマートな方法」でなくてもそんなに困
> らないのは確かです。
今だけを見てればそうなりますね。
で、「一回きり」ってのもいろいろあるわけで、「私はもう二度とプロ
グラミングなんかしません」の一回きりから「私は日常的にプログラミ
ングをしていて、似たようなものを書きまくってますが、今作り上げち
ゃったプログラムの仕事に関しては、今回だけのもので二度といじりま
せん(けど他のと似てます)」とかいう一回きりもあるわけで。
前者だったらまあ確かに出来ちゃった後にスマートな解決法をあえて希
求する必要はないでしょう(知的好奇心とかを除いて)。
後者であれば次回の似た仕事に向けてスマートな方法を求めて、仕事を
改善しないってぇのは、会社員であれば「いずれ首切ってちょーよ」と
言っているのに近い気もしないでもなかったりなんかして。
# 転職まで凌いで金貯めてという予定ってんなら別か?(^^;
趣味でやっているなら、「動けば OK」という趣味ならスマートでなくて
もよくて、「良いものを作りたい」という趣味ならスマートさを求めな
いのは本質に関る問題だし。
--
成田 隆興 @ エー・アイ・ソフト株式会社ソリューシュン開発部
E-mail tak...@aisoft.co.jp
『十分間で決断し、短い理由を添えよ。』
NOSOT <tem...@nospams.gmx.net> writes:
> よく「スマートな方法」という言い方を聞きますよね。「つくってみたんで
> すが、もっとスマートな方法はありませんか」という質問ってよくあります。
> でももう出来てるわけでしょう? 目的は達成されてるんですよね? でしたら
> はたして意味があることなんでしょうか?
> いえべつにダメだとか批判してるわけじゃなくて、あまりに濫用されてるの
> ではないかなあという気がして…。本筋とは関係ないレスでした。
「何故エンジニアは複数の回答を探そうとするのか」について
たまたま電車で読み返してた本に一つの回答が出てる本がありましたので
あげときます。
「スーパーエンジニアへの道―技術リーダーシップの人間学」、
G.M.ワインバーグ (著)、出版社: 共立出版 ISBN: 4320025636
#明確な指針が無くて悩む人は多いみたいね。この手の話って。
ご参考までに。
--
Takahide Nojima