2007-04-19
■ [Perl]Perlでunixコマンド「ls -l」と同じ結果を得る 
タイトルどおりのことを実現するよう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])) ,$_ } <*>;'
コメントを書く