PerlはもともとUNIX系のOS(LinuxやFreeBSD、Mac OS XなどのOSを本稿では以下UNIXと総称します)の上で処理を行うためのスクリプト言語として開発され、今日でもPerlプログラムの多くはUNIX上で実行されています。しかし、「Perlでプログラミング」と言った場合はともすればPerlの言語機能(あるいはモジュール)の話になりがちな一方、「UNIXのプログラミング」の議論においてはC言語で書くことが前提となることが多く、「PerlでUNIXプログラミング」する方法について論ぜられることはあまりありません。これは、C言語がUNIXを扱うための「システムプログラミング言語」として発達してきた一方、Perlがレポート処理やWebアプリケーションなどを記述するためのスクリプト言語として育ってきた歴史を考えれば無理からぬところではあります。
use Errno ();
unless (mkdir $dir or $! == Errno::EEXIST) {
die "failed to create dir:$dir:$!";
}
このコードを理解するうえで必要になる知識は、まず、$!がdualvar、つまり、文字列として評価した場合は文字列を、数値として評価した場合は数値を返す変数であるということです。このコードでは!=演算子を適用しているので、$!は数値として評価されます。LinuxやMac OS Xでは、すでに同名のディレクトリが存在したためにmkdirが失敗すると「17」という値が返ってきます。数値であればロケールによって変化することはありませんから、エラーの判定に適しています。
MKDIR(2) Linux Programmer's Manual MKDIR(2)
NAME
mkdir - create a directory
...
ERRORS
EACCES The parent directory does not allow write permission to the
process, or one of the directories in pathname did not allow
search permission. (See also path_resolution(7).)
EEXIST pathname already exists (not necessarily as a directory). This
includes the case where pathname is a symbolic link, dangling or
not.