May 18, 2006
Perlでステータスコードを返すとき
print <<EOM;
Content-type: text/html
HTML
EOM
このContents-TypeのところにStatusを追加すればOK
print <<EOM;
Status: 404 Not Found
Content-type: text/html
HTML
EOM
Statusの後はコード番号とメッセージを入れる
メッセージは変更しても問題はないが
200はOK
404はNot Found
というように一応決まってたりする
Perlは基本的にContent-typeさえ書けば
自動的に補完される仕組みになってるので
必要なときだけ書けば良い
April 10, 2006
Perlでswfの縦横のサイズを取得する
必要なモジュールは
SWF::Header
SWF::BinStream
Data::TemporaryBag
SWF::BinStream::Codec::Zlib
使い方は
use SWF::Header;
$header_data = SWF::Header->read_file('./test.swf');
縦サイズは
$header_data->{height}
横サイズは
$header_data->{width}
他に取得できる値は
signature => 'FWS' or 'CWS',
version => Shockwave language version,
filelen => Length of entire file in bytes,
xmin => Stage left edge, in twips,
xmax => Stage right edge, in twips from left,
ymin => Stage top edge,
ymax => Stage bottom edge, in twips from top,
rate => Frame rate in fps,
count => total number of frames in movie,
width => calculated width of stage (in pixels),
height => calculated height of stage (in pixels),
duration => calculated duration of movie (in seconds),
background => calculated background color of movie (in html format),
と英語のままですが
バージョン(6.0など)
フレームレート
フレーム数もわかるのはいい感じですね
サーバにモジュールが入ってない場合は
use lib qw(./lib);
use SWF::Header;
としてCGIが置いてあるフォルダからのモジュールディレクトリへのパスを書いて
モジュールディレクトリパスを@INCに追加してください
必要なファイルを配置すると以下の通りになります
./lib/Data/TemporaryBag.pm
./lib/SWF/Header.pm
./lib/SWF/BinStream.pm
./lib/SWF/BinStream/Codec/Zlib.pm
以上4つで動作すると思います
各モジュールはCPANから落としてそのままアップロードで動作可能です
↓CPAN Search
http://search.cpan.org/
October 27, 2004
CSVファイルを扱うモジュール
CSVといってもカンマ区切りでExcelにて見れればいいCSVというレベルですけど
Perlで扱うときに便利なモジュールの使い方メモ
まずText::CSV_XSというモジュールを使うのでuse宣言する
use Text::CSV_XS;
そしてtest.csvを読み込むときは
open(RU, "./test.csv");
eval{flock(RU, 2)};
@csv_data = <RU>;
close(RU);
上記なりで@csv_dataにCSVファイルを全読み込みしてから
foreachなどで1行1行取り出します。
$csv = Text::CSV_XS->new({'binary' => 1});
foreach(@csv_data){
$csv->parse($_);
@columns = $csv->fields();
}
とやると@columnsに全てのカンマ区切りのデータが入ります
「"abc","def","ghi"」が$_に入ってると
$columns[0]にabc
$columns[1]にdef
$columns[2]にghi
が入ります
逆にテキストをCSVに書き出すときは
@new_columnsにさきほどの@columnsと同じ感じで入れて
combineしてから$out_csvに書き出してます。
$csv = Text::CSV_XS->new({'binary' => 1});
$csv->combine(@new_columns);
$out_csv = ($csv->string);
$out_csvは「"abc","def","ghi"」な感じで入ってるのでそのままファイルに書き出せばOK
そのまま出力してもいいのならば
print $csv->stringでいいですね
普通に
$csv = Text::CSV_XS->new();
とやると日本語を扱うときに文字化けするみたいですので
$csv = Text::CSV_XS->new({'binary' => 1});
のようにバイナリ形式でオブジェクトを生成してください
普通にsplit関数を使って「","」で分割すればいいじゃんとかいう人いますが
「"あ"ああ"」のように途中でダブルクォーテーションがあるのとないのととかで
いろいろ面倒なんですよ!
楽にしたいんですよ!
って感じですので使ってます。
February 19, 2004
NET::SMTPでの送信
いつものようにPerlでの仕事がきたときに
sendmailが使えないサーバだったので
NET::SMTPを使いました。
そこでいつものように穴へ・・・
普通にメールは送信できました。
しかしなぜかCcだけが遅れない・・・
test@smtp.comにCcしようとすると
test.smtp.com@SMTPサーバ名になる
これはおかしいと思ってると
$smtp->recipientは$smtp->ccと同じということが判明
早速使ってみると同じくCcには来ない
同じだから同じエラーであたりまえか。。。
実は
$cc = "test@smtp.com";
って入れてるとダメです。
$cc = "test\@smtp.com";
または
$cc = 'test@smtp.com';
です。
ちなみにあて先の変数は
$to = 'test@smtp.com';
でOK