frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

CGI.pm と Basename.pm。

先週は立て続けにCPANに登録されてるライブラリのルーチンを

うだうだ追いまくってたんだけど、結果辿り着いた注意点メモ。

CGI.pm

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」ってーのは、

後で何かトラブルの元になりやすいので、個人的にはダメダメプーです。

File::Basename.pm

fileparse_set_fstype $^O;

1;

何気にパッケージの最後の方で、

OS種別を設定してるんだよなぁ、これ。

basename や dirname で、

ファイル名やディレクトリだけ取得する際に使う正規表現

各OSのデリミタに応じて設定されてるんで、

フルパスが、どのOS上のものなのか、

先ずは設定してあげないとアカンのだけど。

その設定方法はfileparse_set_fstype に OS種別を渡すだけで、

上記の「$^O」は、uname -a を実行した時の最初の単語なので

Linux上で実行すれば「linux」、

Cygwinで実行すれば「cygwin」が設定される、と。

だけど、実は 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種別を最初に設定している箇所が、わかりにくかったからなのかなぁ?