Perlで階層を一気にパーミッションを指定してmkdirするとき、インターネットではFile::Pathを使って以下のような書き方を見かける。
mkpath( "/hoge/moge/hoge", 0, 0775);
しかし、この書き方は誤動作することがある。
インターネットでドキュメントを確認してみますと、以下の4つの書き方がある。
mkpath( $dir )
mkpath( $dir, $verbose, $mode )
mkpath( [$dir1, $dir2,...], $verbose, $mode )
mkpath( $dir1, $dir2,..., \%opt )
この4つの書き方で、2番目と4番目が非常に似ているので、2番目で書いたつもりが、4番目で動作することが有り得る、verboseのつもりで書いていても、それをdir2と認識しゴミディレクトリーを作成してしまう恐れがある。
実行したディレレクトリーに「0」という謎のディレクトリーが作られていたら、間違い無く、解釈ミスが起きている。
回避方法は、以下のように、最初から4番目の書き方で記載するのが良い。
mkpath( "/hoge/moge/hoge", {chmod => 0775});