「初めてのPerl」 12章 (ディレクトリ操作)

はてブを使い始めてみようと思ったのですが、結局人気エントリーばかりを登録してしまっている自分に気づき、早くも挫折モードのbonlifeです。「初めてのPerl」、早く終わらせて次に進みたいところですが、まだ12章…。12章の内容は以下の通りです。

  • ディレクトリの移動 (chdir)
  • グロブによるファイル名パターンの展開 (glob)
  • ディレクトリハンドル (opendir, readdir, closedir)

軽めの章ですね。globを使わないglobの書き方はファイルハンドルっぽくて分かりづらいので自分で書く時は使わないだろうなぁ。昔からPerl使ってる人はglobは使わないのかしら。うーむ。他にとりたてて書くこともないので、早速練習問題のbonlife的解答例です。
ex12-1.pl

  • ユーザからディレクトリ名を入力してもらい、そのディレクトリに移動し、ディレクトリの内容(ドットで始まるファイルを除く)をアルファベット順に表示
  • ユーザの入力した行に空白文字だけしか含まれていない場合、ユーザのホームディレクトリに移動
#! perl
use strict;
use warnings;

print "Enter a directory : ";
chomp(my $dir = <STDIN>);
if ( $dir =~ /^\s*$/ ) {
    chdir or die "Cannot chdir to your home dir : $!";
} else {
    chdir $dir or die "Cannot chdir to \"$dir\" : $!";
}

my @all_files = glob "*";
foreach my $file ( sort @all_files ) {
    print $file, "\n";
}

出力結果は以下の通りです。

ex12-1.pl
Enter a directory : .
ex10-1.pl
ex11-1.pl
ex11-2.pl
ex11-3.pl
ex12-1.pl
ex12-2.pl
ex12-3.pl
(攻略)
ex12-1.pl
Enter a directory :
Cannot chdir to your home dir : Bad file descriptor at ex12-1.pl line 8, <STDIN> line 1.

解答例を見て気づいたことは以下の通り。

  • Windows XPでは引数なしのchdirはまともに動かない様子

ソースコードもだいたい同じだったので、次の練習問題です。
ex12-2.pl

  • 問題1のプログラムを改造して、ドット以外で始まるものだけではなく、すべてのファイルを表示させる
#! perl
use strict;
use warnings;

print "Enter a directory : ";
chomp(my $dir = <STDIN>);
if ( $dir =~ /^\s*$/ ) {
    chdir or die "Cannot chdir to your home dir : $!";
} else {
    chdir $dir or die "Cannot chdir to \"$dir\" : $!";
}

my @all_files = glob ".* *";
foreach my $file ( sort @all_files ) {
    print $file, "\n";
}

出力結果は以下の通りです。

ex12-2.pl
Enter a directory : .
.
..
.file_whose_name_starts_with_dot
ex10-1.pl
ex11-1.pl
ex11-2.pl
ex11-3.pl
ex12-1.pl
ex12-2.pl
ex12-3.pl
(後略)

解答例を見て気づいたことは特になし。ということで、3問目。
ex12-3.pl

  • 問題2をグロブを使わずにディレクトリハンドルで解く
#! perl
use strict;
use warnings;

print "Enter a directory : ";
chomp(my $dir = <STDIN>);
opendir DH, $dir or die "Cannot change a directory to \"$dir\" : $!";

foreach my $file ( sort readdir DH ) {
    print $file, "\n";
}
closedir DH;

出力結果は問2の出力結果と同じなので省略します。
解答例を見て気づいたこと以下の通りです。

  • 空白行のチェックを追加し忘れました…
  • chdirした後、opendirする場合は、移動後のディレクトリを開くことになるため、opendirでは"."を開く

こういう基本的な内容は「ふーん。」って感じで面白みに欠けますね。でも、基礎がグラグラしたまま小手先の技に頼ってしまうのも気持ち悪いので、コツコツと勉強してみます。あー、飽きてしまいそう!