File::Temp, Path::Class, Path::Tiny
Path::Class と Path::Tiny はほぼ同じことができるモジュールで、どっちを使っても特に変わりはないんですが「やっぱこっち〜」って感じで変えるとハマるような差異があり、今回ハマりましたのでご紹介します。
Path::Class->tempdir, Path::Tiny->tempdir
いずれのモジュールにも、tempdir というメソッドがあり、これはいずれも全く同じ引数をとり、File::Temp を使ってテンポラリディレクトリを掘ってパスオブジェクトを返すだけのメソッドです。
しかし内部で使っている File::Temp のメソッドが少々違うため、CLEANUP まわりの挙動が以下のように異ります。
- Path::Class は File::Temp::tempdir() を使っている
- CLEANUP => 0 がデフォルト (デフォルトで削除されない)
- CLEANUP => 1 を指定した場合 Perl プロセス終了時にファイルが削除される
- Path::Tiny は File::Temp->newdir() を使っている
- CLEANUP => 1 がデフォルト (デフォルトで削除される)
- 返ってきたオブジェクトが DESTROY されるときにファイルが削除される
File::Temp の挙動
- File::Temp::tempdir() は文字列を返す
- File::Temp->newdir() はオブジェクトを返す
- 内部的には File::Temp::tempdir() を呼んでる
- DESTROY が設定されている
ハマる例
普通ハマらないんですが、アホなことしてるとハマります。
- Path::Class->tempdir を使っていて、Path::Tiny に変えた場合、その後の処理でファイルが存在していない場合がある
- Path::Tiny->tempdir を使っていて、Path::Class に変えた場合、ファイルが削除されない場合がある
関連エントリー
- Mockito の any(Class<?> clazz) や anyString() や他の any ナンチャラは型チェックはしない any() 系のマッチャは常に「あらゆるオブジェクト」にマッチします。この挙動は Javadoc にも書いてあって、もしかすると将来的に変更...
- ccls + vim-lsp で補完時に後続のwhitespaceが削除される 以下をいれるととりあえずおさまる。ccls と相性が悪い?? let g:lsp_insert_text_enabled = 0 let g...
- capacitor で Android 向けに minifyEnabled true Android では、アプリのサイズをできるだけ減らしたりするために、リリース前にアプリ全体のコードの最適化 (いわゆるツリーシェイキング)...
- Error:java: cannot access org.apache.http.annotation.Immutable class file for org.apache.http.annotation.Immutable not found http://www.apache.org/dist/httpcomponents/httpcore/RELEASE_NOTES-4.4.x...
- 現在の h2o.conf.yaml 今のこのサイトの h2o.conf.yaml です。HTTPS (443) のみを処理しています。HTTP (80) は nginx で受け...