CGI.pm と Basename.pm。
先週は立て続けにCPANに登録されてるライブラリのルーチンを
うだうだ追いまくってたんだけど、結果辿り着いた注意点メモ。
read メソッド
# If we hit the boundary, remove the CRLF from the end.
return ($bytesToReturn==$start)
? substr($returnval,0,-2) : $returnval;
「改行コードを消すのよん」と言っているんだけど
最後の2バイトを削除している次第。
それより素直に $returnval =~ s/\r\n$//; じゃダメなんだろうか?(苦笑)
そもそも substr に対してマイナス使って「最後からXX」ってーのは、
後で何かトラブルの元になりやすいので、個人的にはダメダメプーです。
fileparse_set_fstype $^O;
1;
何気にパッケージの最後の方で、
OS種別を設定してるんだよなぁ、これ。
basename や dirname で、
ファイル名やディレクトリだけ取得する際に使う正規表現は
各OSのデリミタに応じて設定されてるんで、
フルパスが、どのOS上のものなのか、
先ずは設定してあげないとアカンのだけど。
その設定方法はfileparse_set_fstype に OS種別を渡すだけで、
上記の「$^O」は、uname -a を実行した時の最初の単語なので
だけど、実は fileparse_set_fstype の中で 渡されたOS種別を、
グローバル変数の $File::Basename::Fileparse_fstype に
格納していたりするもんだから、
外部から汚染される可能性もあったりして…orz
なにはともあれ、注意せなアカンのは
様々なOSのフルパスに対して、basename や dirname する場合は
都度OS種別を fileparse_set_fstype で設定し、
basename や dirname を使い終わった後は、
元のOS種別に戻してやる事を忘れずに。
こんな風に↓
my $fullPath = 'Macintosh HD:Users:anigon:Desktop:test.txt';
my $beforeFstype = fileparse_set_fstype('MacOS');
print basename $fullPath;
fileparse_set_fstype($beforeFstype); # こうして元のOS種別に戻す
ちなみに最新の File::Basename では、
「fileparse_set_fstype $^O;」の行が、ソース中の最初の方に移動してました。
やっぱり、OS種別を最初に設定している箇所が、わかりにくかったからなのかなぁ?