Hatena::Grouparaistudy

iwasekiの日記

2007-04-19

[]Perlunixコマンドls -l」と同じ結果を得る はてなブックマーク - Perlでunixコマンド「ls -l」と同じ結果を得る - iwasekiの日記

タイトルどおりのことを実現するようid:czk-htnさんからパスが飛んできた。実際はご本人が実現した上でパスしてきたみたいですが、勉強がてら取り組んでみた。

Perlで書くにあたり、条件があった。

他にもあった気がするけど、大体こんな感じ。

挫折して報告した

perl -e 'system"ls -l"'

我ながら[これはひどい][死ねばいいのに]。しかも要件を満たしていないというダメっぷり。id:czk-htnさんからはw付きで却下された。当たり前だ。

ls -al」が先にできた

きっとこの問題を出してくるってことはそれなりの関数があるんだろうと調べてみると、いかにもな関数を見つけたのでささっと書いてみた。この時点でワンライナーであることは後回しにした。

#!/usr/bin/perl

opendir(DIR,'.');
@file = sort readdir(DIR);
foreach(@file){
	$time = localtime ((stat($_))[9]);
	print "$time"."\t"."$_\n";
}
closedir(DIR);

実行結果は「ls -l」ではなく「ls -al」だったが・・・KO・U・HU・N☆(by 僕の見た秩序。

だいぶ近づいてきているようだ。

普通Perlプログラムとしては完成

今度はグラブというものを使ってみた。

#!/usr/bin/perl

@file = <*>;
foreach(@file){
	$time = localtime ((stat($_))[9]);
	print "$time"."\t"."$_\n";
}

実行結果

Tue Apr 17 09:56:30 2007        256colors2.pl
Tue Nov  7 13:07:03 2006        Desktop
Sat Mar 17 19:22:22 2007        hello.pl
Sat Apr 21 11:59:21 2007        ls-l.pl

できたー。が、これをワンライナーに書き換えなければならない。

完成

foreachをどうしたらいいのかがわからないで悶々としてたところでid:czk-htnさんから「map使ったらいいんさ」と助け舟が。そのまんまid:czk-htnさんが完成させたのがコレ。

perl -e 'map { printf "%s\t%s\n", scalar(localtime ((stat($_))[9])) ,$_ } <*>;'

printfと%sで出力を整形させてるのがポイントか。printfの解説はこちら