■splitで、最後の空の要素がカットされてしまう
たとえば、、"a:b:c:d:"っといった場合に、('a','b','c','d','')と言った
値を期待して、
split(/:/, "a:b:c:d:");
とすると、期待通りのリスト値は得られず、('a','b','c','d')のように
最後の空要素がカットされてしまいます。
この現象を防ぐには、第三引数に大きな数字を指定すればうまくいきます。
split(/:/, "a:b:c:d:", 9999);
■GIFの幅と高さを得る。
($width, $height) = &getsize(ファイル名);
のように使います。
sub getsize{
local($gif) = @_;
open(FILE, $gif) || return (0,0);
read(FILE, $header, 18, 0);
($sign, $wid, $hei) = unpack("A6vv", $header);
($wid, $hei);
}
■HTMLタグと文章をばらす
$html = <>;
foreach (split(/, $html)){
@tmp = split(/>/);
$tag = "<" . shift(@tmp) . ">";
$nakami = join(">", @tmp);
# 何らかの処理
}
ただし、
のようなHTMLに対してはこの方法は無効です。
■MacやDosのファイルを読む
cat mac.txt | perl -p -e 's/\r/\n/g' | less
cat dos.txt | perl -p -e 's/\r\n/\n/g' | less
cat dosORmac.txt | perl -p -e 's/\r\n/\n/g;s/\r/\n/g' | less
○おまけ
さらに、lessが日本語版じゃなかった場合に日本語を読む方法。
nkf -j dosORmac.txt | perl -p -e 's/\r\n/\n/g;s/\r/\n/g' | less -r
# 端末がJISを表示できる必要があります。
■曜日を計算する
sub date2week{
local($year, $month, $day) = @_;
('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat')
[($year + int($year/4) - int($year/100) +
int($year/400) + int((13*$month+8)/5) + $day) % 7];
}
いやまて、ちょい違うぞこれ。。
yearは4桁の西暦、$monthは月で1から12までの整数、$dayは日付です。
○例
$date="1998/12/31";
# 固定長のデータの場合、splitよりunpackの方が速いのだ。
($year, $month, $day) = unpack("a4xa2xa2", $date);
print &date2week($year, $month, $day);
■/aa/ .. /bb/の使い方
たとえば、
foreach $file (@ARGV){
open(FILE,$file);
while(){
last if(/aa/ .. /bb/);
print;
}
close(FILE);
}
などとしては「いけません」。このままだと、lastが呼ばれた時点で「/aa/が一度真になった」という情報が消えないので、2回目のファイルでは、ファイルの先頭からいきなり(/aa/ .. /bb/)が真になります。