初めてのPerl 第12章

練習問題の回答をメモ。

ex12-1
#!/usr/bin/perl
use strict;

print "Enter a directory name: ";
chomp(my $dir = <STDIN>);

if ($dir =~ /^\s*$/) {
  chdir or die "Cannot chdir to home directory: $!";
} else {
  chdir "$dir" or die "Cannot chdir to '$dir': $!";
}


my @all_files = glob "*";
print join "\n", @all_files;
print "\n";

$dir が空白文字列又は空行の場合を判別する処理を忘れないようにしよう。そうしないと、空白が1個以上あると「そんなディレクトリねぇ!」って怒られるし、空行を入力しても「Use of chdir('') or chdir(undef) as chdir() is deprecated」(chdir('')又はchdir(undef)をchdir()として使用することは非推奨です)って警告されちゃうよ。

ex12-2
#!/usr/bin/perl
use strict;

print "Enter a directory name: ";
chomp(my $dir = <STDIN>);

if ($dir =~ /^\s*$/) {
  chdir or die "Cannot chdir to home directory: $!";
} else {
  chdir "$dir" or die "Cannot chdir to '$dir': $!";
}

# ドットで始まるファイルも表示する
my @all_files = glob ".* *";
print join "\n", sort @all_files;
print "\n";
ex12-3
#!/usr/bin/perl
use strict;

print "Enter a directory name: ";
chomp(my $dir = <STDIN>);

if ($dir =~ /^\s*$/) {
  chdir or die "Cannot chdir to home directory: $!";
} else {
  chdir "$dir" or die "Cannot chdir to $dir: $!";
}

opendir DIR, "." or die "Cannot open $dir: $!";

## readdir はそのディレクトリに入っているすべてのファイル名のリストを返すので、こんな回りくどいことしなくてよかった
# my @dir_names;
# while (my $name = readdir DIR) {
# #  $name = "$dir/$name";
#   push @dir_names, $name;
# }

# print join "\n", sort @dir_names;
# print "\n";

foreach (sort readdir DIR) {
  # next if /^\./;
  print "$_\n";
}

readdir関数はそのディレクトリに入っているすべてのファイル名のリストを返すよ。
ついでだから、ドットファイルをスキップする行も書いておこう。

疑問点

Perl 5.6 以上のバージョンではグロブとディレクトリハンドルの実行速度の違いを意識するとこは無い(p.205)みたいだから使い易いグロブを使えばいいのかな?ディレクトリハンドルを使うのは「マシンのパワーを極限まで使い切るようなアプリケーション」だけでOKってこと?