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