開発環境
- 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 コメント:
コメントを投稿