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章に入りますか。