2012年4月30日月曜日

開発環境

『続・初めての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 コメント:

コメントを投稿