2013年2月5日火曜日

開発環境

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

その他参考書籍

4.

コード(BBEdit)

sample.pl

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.016;
binmode STDOUT, ':utf8';
binmode STDIN, ':utf8';

sub dump_data_for_path {
    my ($path, $data, $pre) = @_;
    print "  " x $pre . "$path";
    if (not defined $data) {
        print "\n";
        return;
    }
    my %directory = %$data;
    if (%directory) {
        print ", with contents:\n";
        $pre += 1;
        for (sort keys %directory) {
            dump_data_for_path($_, $directory{$_}, $pre);
        }
        $pre -= 1;
    } else {
        print ", an empty directory\n";
    }
}

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;
}

dump_data_for_path('.', data_for_path('.'), 0);

入出力結果(Terminal)

$ ./sample.pl
., with contents:
  .DS_Store
  .out
  Gilligan:
  Ginger:
  Lovey:
  MaryAnn:
  MonkeyMan:
  Oogaboogoo, with contents:
    date.pm
  Professor:
  Skipper:
  Thurston:
  __pycache__, with contents:
    sample.cpython-32.pyc
    sample.cpython-33.pyc
  barney
  betty
  coconet.dat
  coconet_total.dat
  coconet_total_2.dat
  date.log
  date.txt
  distribute-0.6.34.tar.gz
  fred
  gilligan.info
  ginger.info
  hello_world.pl
  link_test
  ln.txt
  ln1.txt
  log
  log_file.txt
  lovey.info
  ls.err
  ls.out
  maryann.info
  monkeyman.info
  numbers
  perl_kamimura_blog.html
  perl_program1
  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.py
  sample_folder, with contents:
    .DS_Store
    sample1.bak
    test
  sample_text
  skipper.info
  some_folder, with contents:
    .DS_Store
    ln.txt
    mv1.txt
    sample.pl
    some_file
    some_file1
    some_file2
    symlink.txt
  sortable_hash
  standings.db
  test.out
  test.txt
  test_folder, with contents:
    .DS_Store
    sample, with contents:
      sample.txt
  test_link
  thurston.info
  tmp_folder, with contents:
    sample.pl
    some_folder, with contents:
      some_file1
  total_bytes.dat
  untitled text 2.txt
$

pythonの場合。

sample.py

コード(BBEdit)

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

import os, glob

def dump_data_for_path(path, data, pre):
    print("{0}{1}".format("  " * pre, os.path.basename(path)), end="")
    if data:
        print(", with contents")
        pre += 1
        for k in sorted(data.keys()):
            dump_data_for_path(k, data[k], pre)
        pre -= 1
    else:
        if os.path.isfile(path):
            print()
        elif os.path.isdir(path):
            print(", an empty directory")

def data_for_path(path):
    if os.path.isfile(path) or os.path.islink(path):
        return
    if os.path.isdir(path):
        directory = {}
        for name in glob.glob(path + "/*"):
            directory[name] = data_for_path(name)
        return directory
    print("{0} is neither a file nor a directory".format(path))
    return

dump_data_for_path(".", data_for_path("."), 0)

入出力結果(Terminal)

$ ./sample.py
., with contents
  Gilligan:
  Ginger:
  Lovey:
  MaryAnn:
  MonkeyMan:
  Oogaboogoo, with contents
    date.pm
  Professor:
  Skipper:
  Thurston:
  __pycache__, with contents
    sample.cpython-32.pyc
    sample.cpython-33.pyc
  barney
  betty
  coconet.dat
  coconet_total.dat
  coconet_total_2.dat
  date.log
  date.txt
  distribute-0.6.34.tar.gz
  fred
  gilligan.info
  ginger.info
  hello_world.pl
  link_test
  ln.txt
  ln1.txt
  log
  log_file.txt
  lovey.info
  ls.err
  ls.out
  maryann.info
  monkeyman.info
  numbers
  perl_kamimura_blog
  perl_kamimura_blog.html
  perl_program1
  professor.info
  result
  sample, with contents
    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.py
  sample_folder, with contents
    sample1.bak
    test
  sample_text
  skipper.info
  some_folder, with contents
    ln.txt
    mv1.txt
    sample.pl
    some_file
    some_file1
    some_file2
    symlink.txt  sortable_hash
  standings.db
  test.out
  test.txt
  test_folder, with contents
    sample, with contents
      sample.txt
  test_link
  thurston.info
  tmp_folder, with contents
    sample.pl
    some_folder, with contents
      some_file1
  total_bytes.dat
  untitled text 2.txt
$

0 コメント:

コメントを投稿