2012年11月1日木曜日

開発環境

『続・初めてのPerl 改訂版』(Randal L. Schwartz, brian d foy, Tom Phoenix 著、伊藤 直也田中 慎司吉川 英興 監訳、株式会社ロングテール/長尾 高弘 訳、オライリー・ジャパン、2006年、ISBN4-87311-305-9) の9章(リファレンスを使った実践的なテクニック), 9.9(練習問題)4を解いてみる。

その他参考書籍

4.

コード(TextWrangler)

sample.pl

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.016;

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 "can't 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 ", width contents:\n";
    $pre += 1;
    for(sort keys %directory){
      dump_data_for_path($_, $directory{$_}, $pre);
    }  
  } else {
    print ", an empty direcotory\n";
  }
}

dump_data_for_path(".", data_for_path("."));

入出力結果(Terminal)

$ ./sample.pl
., width contents:
  .DS_Store
  .out
  Oogaboogoo, width contents:
    date.pm
  barney
  betty
  coconet.dat
  date.txt
  fred
  gilligan.info
  ginger.info
  link_test
  log
  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
  result
  sample, width contents:
    .DS_Store
    sample_folder, an empty direcotory
    sample_folder copy, an empty direcotory
    sample_folder copy 2, an empty direcotory
    sample_folder copy 3, an empty direcotory
    sample_folder copy 4, an empty direcotory
  sample.pl
  sample.pl.bak
  sample.pl.bak.bak
  sample_folder, width contents:
    .DS_Store
    sample1.bak
    test
  sample_text
  sample_text.out
  sample_text.out.bak
  skipper.info
  some_folder, width contents:
    sample.pl
    some_file
    some_file1
    some_file2
  sortable_hash
  standings.db
  test.bak
  test.out
  test.txt
  test_folder, width contents:
    .DS_Store
    sample, width contents:
      sample.txt
  test_link
  thurston.info
  tmp_folder, width contents:
    sample.pl
    some_folder, width contents:
      some_file1
  total_bytes.dat
$

0 コメント:

コメントを投稿