12章 練習問題3

問題2をディレクトリハンドルを使ってといた人は、それをグロブを使うように書き換えてください。グロブを使って解いた人は、ディレクトリハンドルを使うように書き換えてください。

今度は12章 練習問題2 - ABラボラトリのコードを改造。

以下が作成コードです。

#! /usr/local/bin/perl

use strict;
use warnings;

#プログラムの説明を出力
print "指令されたディレクトリの、ドットファイルを含む全てのファイルを表\示するプログラムです。\n";

#ユーザにディレクトリ名を入力してもらう。メッセージを出力した後、標準入力を読み込む
print "ディレクトリ名を入力してください。\n\n";
chomp(my $dir = <STDIN>);

#何も入力されていないか判定する
die "何も入力されませんでした。プログラムの実行を終了します。\n"
    if ($dir eq '');

#指定ディレクトリに移動する。空白文字のみ入力された場合は、ユーザのホームディレクトリに移動する。入力された場合は、指定ディレクトリに移動
if ($dir =~ /^\s+$/) {
    print "空白文字しか入力されていません。代わりにホームディレクトリへ移動します。\n";
    chdir or die "ホームディレクトリに移動できませんでした。\n";
} else {
    chdir "$dir" or die "$dir ディレクトリに移動できませんでした。\n";
    print "$dir ディレクトリへ移動します。\n";
}

#ドットで始まるファイルを含む、移動先ディレクトリの内容を昇順に表示する(ドットで始まるファイルが必要なので、ディレクトリハンドルを用いる)


opendir DIR, "."
    or die "ディレクトリハンドルをオープンできませんでした\n";

my @files = readdir DIR;
print "移動先ディレクトリの内容を表\示します。\n";
for (sort @files) {
    print "$_\n";
}

closedir DIR;


実行結果は以下になります。

C:\Perl\hajip>perl ex12-3.pl
指令されたディレクトリの、ドットファイルを含む全てのファイルを表示するプログラムです。
ディレクトリ名を入力してください。


空白文字しか入力されていません。代わりにホームディレクトリへ移動します。
移動先ディレクトリの内容を表示します。
.
..
.bash_history
.cpan
.emacs
.emacs.d
.emacs~
.kkcrc
.recentf
TUTORIAL.ja
bin
calc.pl
font-setup.el
perl

大丈夫ですね。
実は、opendir関数に与える引数をどうしようか迷いました。
カレントディレクトリ情報を与えたいものの、ホームディレクトリに移動していた場合には対応できなかったので。
ですが、クックブックを参照してドットを使えばいいんだとわかりました。
いちいち変数に記憶させることもないので、シンプルですね。


コードの問題点ですが、

my @files = readdir DIR;
print "移動先ディレクトリの内容を表\示します。\n";
for (sort @files) {

配列@filesを定義する必要はないことくらいでしょうか。

for (sort readdir DIR) {

でも問題はないと。


OKですね。では13章に入りますか。