開発環境
- 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.
やり方の1つ。(「やり方は何通りもある」(TIMTOWTDI(There Is More Than One Way To Do It.)))
コード(TextWrangler)
#!/usr/bin/env perl
use strict;
use warnings;
sub data_for_path{
my $path = shift;
return undef if -f $path or -l $path;
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 $indent = shift || "";
print "$indent$path";
if(not defined $data){
print "\n";
return;
}
my %directory = %$data;
if(%directory){
print ", with contents:\n";
for(sort keys %directory){
dump_data_for_path($_, $directory{$_}, "$indent ");
}
} else {
print ", an empty directory\n";
}
}
dump_data_for_path('.', data_for_path('.'));
入出力結果(Terminal)
$ perl sample.pl
., with contents:
.DS_Store
.out
HASH(0x7fa4740277e0)
coconet.dat
date.txt
gilligan.info
ginger.info
log_file.txt
lovey.info
ls.err
ls.out
maryann.info
monkeyman.info
numbers
perl_kamimura_blog
perl_program.bak.bak
perl_program.pl
perl_program1
perl_program1.bak
professor.info
sample, an empty directory
sample.bak
sample.pl
sample_folder, with contents:
.DS_Store
sample_text
sample_text.bak
sample_text.out
sample_text.out.bak
skipper.info
sortable_hash
test
test.bak
test_folder, with contents:
.DS_Store
sample, with contents:
sample.txt
test_link
test_new
thurston.info
total_bytes.dat
$ find . -print
.
./.DS_Store
./.out
./coconet.dat
./date.txt
./gilligan.info
./ginger.info
./HASH(0x7fa4740277e0)
./log_file.txt
./lovey.info
./ls.err
./ls.out
./maryann.info
./monkeyman.info
./numbers
./perl_kamimura_blog
./perl_program.bak.bak
./perl_program.pl
./perl_program1
./perl_program1.bak
./professor.info
./sample
./sample.bak
./sample.pl
./sample_folder
./sample_folder/.DS_Store
./sample_text
./sample_text.bak
./sample_text.out
./sample_text.out.bak
./skipper.info
./sortable_hash
./test
./test.bak
./test_folder
./test_folder/.DS_Store
./test_folder/sample
./test_folder/sample/sample.txt
./test_link
./test_new
./thurston.info
./total_bytes.dat
$
0 コメント:
コメントを投稿