開発環境
- OS X Lion - Apple(OS)
- TextWrangler(Text Editor) (BBEditの機能制限無料版、light版)
- Script言語:Perl
『続・初めてのPerl 改訂版』(Randal L. Schwartz, brian d foy, Tom Phoenix 著、伊藤 直也、田中 慎司、吉川 英興 監訳、株式会社ロングテール/長尾 高弘 訳、オライリー・ジャパン、2006年、ISBN4-87311-305-9) の9章(リファレンスを使った実践的なテクニック)、9.9(練習問題)4を解いてみる。
4.
コード(TextWrangler)
#!/usr/bin/env perl use strict; use warnings; use 5.012; sub data_for_path{ my $path = shift; if(-f $path or -l $path){ return undef; } if(-d $path){ my %directory; opendir PATH, $path or die "Cannot opendir $path: $!"; my @names = readdir PATH; closedir PATH; for my $name(@names){ next if $name eq '.' or $name eq '..'; $directory{$name} = data_for_path("$path/$name"); } return \%directory; } warn "$path is neither a file nor a directory\n"; return undef; } sub dump_data_for_path{ my $path = shift; my $data = shift; my $pre = shift // 0; print " " x $pre . "$path"; if(not defined $data){ print "\n"; return; } my %directory = %$data; if(%directory){ print ", with contents:\n"; $pre++; for(sort keys %directory){ dump_data_for_path($_,$directory{$_}, $pre); } } else { print ", an empty directory\n"; } } dump_data_for_path('.',data_for_path('.'),0);
入出力結果(Terminal)
$ ./sample.pl ., with contents: .DS_Store .out barney betty coconet.dat date.txt fred gilligan.info ginger.info link_test log_file.txt lovey.info ls.err ls.out maryann.info monkeyman.info numbers oogaboogoo.pm perl_kamimura_blog perl_program.bak.bak perl_program.pl perl_program1 perl_program1.bak professor.info result sample, with contents: .DS_Store sample_folder, an empty directory sample_folder copy, an empty directory sample_folder copy 2, an empty directory sample_folder copy 3, an empty directory sample_folder copy 4, an empty directory sample.pl sample.pl.bak sample_folder, with contents: .DS_Store sample1.bak test sample_text sample_text.out sample_text.out.bak skipper.info some_file sortable_hash test test.bak test.out test_folder, with contents: .DS_Store sample, with contents: sample.txt test_link test_new thurston.info tmp tmp.pl tmp1 tmp_file tmp_link total_bytes.dat $
0 コメント:
コメントを投稿