gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

巷のソースちぇ〜っく:Perl編

ふと思い出した…どこぞの掲示板に実在するソースなのですが。


ファイルopen
ロック開始
ファイル読み込み
ファイルclose

データ処理

ファイルopen
ロック開始
データ書き込み
ロック解除
ファイルclose

………。googleその他のランキング見てる限り「結構有名どころのフリーウェア掲示板」です。
何ゆえにこーゆーロックもどき構造に至ったのか、ちと興味ありあり。
とりあえず「fseekくらいは覚えとこうね」って感じでしょうか?

その値は数字? 数値?

直接的にはPHPなのですが、まぁPerlでもほぼ確定で同様のことが起きると思うので、あわせて。
型がしっかりした言語ではおきにくい事故なのですが…多分。型が暗黙に色々といじくられてしまう言語は、多分「プログラマの脳内でも自動補完」がなされてしまい、結果的に物凄いことが時々起きます。
直接的具体的には、こんな事象でした。


ビットマスク関連の計算がありまして。「1バイト値のうち、上位nビットを残し、それ以下をマスクする」系の処理を連想してください。
例えばnが4であれば、1111 0000(0xf0)を、目的とする値にぶつけて論理演算すればよいのですが。
ここで、間違えて


$base_num = "11110000";
とやってしまいました。
恐らくは頭の中で無意識にこの値を「二進数として」取り扱うつもりだったのでしょう。
でもスクリプト言語では、これは「一千百十一万」という10進数として取り扱われてしまいます。以降この値を使って論理演算すれば以下略。


これ以外にも。例えば"0"というものを見たときに、スクリプトではこれを「数字」としても「数値」としても扱えてしまいます。でも、実際には数値と数字はまったく違うものです。
数値は「値」であり、メモリの中に格納されている実際の値です。
数字は「文字」であり、それは「ある値を文字としてあらわしたときに出てくるもの」です。
マシン語でVRAMとかやってるとよくわかるんですけどねぇ(苦笑
多分、ここを読んでる人の多くは「わかっている」ことだと思うのですが。あなたが「教えている」人はちゃんと理解できてますか?
…っていうのを、自戒を込めて書いてます(笑

なまほげ君登場予告(笑

んっと。…PHP君、色々と面倒な挙動が多すぎです。なので、

  • <?phpより前、或いは?>より後ろに1bit足りとでも余分なデータは認めない
  • 全角空白みつけたらワーニング
  • 先日発見した「引数の数」のチェック

をしてくれる「Perlの」プログラムでも書いてみようかなぁと(笑
ノリとしては、ナマハゲのように「行儀の悪いプログラム いねが〜」って感じでソースコードをホゲホゲするのでなまほげ君(笑
…いつになったら出来上がることやら(苦笑

FF XI のマクロをPerlで切り出す

えっと…本気でメモなのですが。
Final Fantasy XI online ってのがありまして。で、PC(Windows)版ってのがあるのですが。
マクロ周りでチェックをいれてみたのですが…
mcr9.dat
とかって名前で入ってるのはいいのですが…もろバイナリなんです。
んで…私のように「PS2と混在」の場合、とりあえずPC版のマクロのリストとかが作りたくなりまして。でもバイナリを読み上げるのはちょっと人としてどうかと思いまして。


でまぁ「取り合えず簡易的に抜き出すっぽいPerl」を作りました。
文字コードは変換してないですし(元々はShift JIS)、かなり作りも荒いのですが。
まぁ本格的に使いたかったら適当に修正してください :-P


ってか…同アカウント内であれば、PCとPS2とでマクロのやり取りくらい通信とかでやりたいよぉ ;;


そうそう。
tab変換した文字列は、:で囲まれてよくわからんバイナリ化しています。
そんなんの辞書なんぞ用意するほど丁寧じゃありません(笑


#!/usr/bin/perl

$fn = "./" . $ARGV[0];

open (IN, $fn);
$data = "";
while() {
$data .= $_;
}
close(IN);

#
my @ret;
$count = 0;

sub cut { my ($a) = @_; $count += $a; }
sub add {
my ($a) = @_;
$wk = substr($data, $count, $a);
$wk =~ s/[\x00]//g ;
$wk =~ s/[\xFD]/:/g ;
$count += $a;
push @ret, $wk;
}

# 初期ヘッダ切り出し
cut(28);

# データ取得
for($i = 0; $i < 20; $i ++) {
add(61);
add(61);
add(61);
add(61);
add(61);
add(61);
add(14); # タイトル
push @ret, "------";
}

# 出力
$fn = $fn . ".txt";
open (OUT, "> $fn");
foreach $wk (@ret) {
print OUT $wk . "\r\n";
}
close(OUT);

DBD::mysqlのインストール

PerlのDBD::mysqlのインストール関連のお話です。


基本は
http://y-kit.jp/saba/xp/cpan.htm
を参照していただくのがぐっどなのですが…ちょいとはまったところなどを軽くメモ。


そうそう。私は
/opt/db/mysql-バージョン番号
にインストールしてますんであしからず。


とりあえず
ln -s /opt/db/mysql-4.0.24/bin/mysql_config /usr/local/bin/mysql_config
しておきます。
んで…


まず最大のポイントは

「要求されている戻り値の型」の判断

ちょいとCGI.pmのparamメソッドを調べていて見つけたのですが。


関数 wantarray
実行中の関数の「戻り値」として配列値を要求していれば true を、スカラー(単項目 通常の$で始まる変数)を要求していればfalseを返す。


…すごいなぁ。「戻り値」の形の判断をするってあたりが。
例題。

sub foo
{
if (wantarray) {
# 配列復帰としての処理
} else {
# スカラー復帰としての処理
}
}

なんて関数を用意すると、
@data = foo();
なら配列復帰処理のifブロックが反応して、
$data = foo();
ってするとスカラー復帰処理のifブロックが反応するです。


………便利っちゃぁ便利だけど。多言語との移植性その他考えると、乱用は考えものだなぁ。
まぁ一応チェック入れておくですって感じで。