2012年7月26日木曜日

開発環境

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

コメントを投稿