ふと思い出した…どこぞの掲示板に実在するソースなのですが。
………。googleその他のランキング見てる限り「結構有名どころのフリーウェア掲示板」です。
ファイルopen
ロック開始
ファイル読み込み
ファイルcloseデータ処理
ファイルopen
ロック開始
データ書き込み
ロック解除
ファイルclose
何ゆえにこーゆーロックもどき構造に至ったのか、ちと興味ありあり。
とりあえず「fseekくらいは覚えとこうね」って感じでしょうか?
直接的にはPHPなのですが、まぁPerlでもほぼ確定で同様のことが起きると思うので、あわせて。
型がしっかりした言語ではおきにくい事故なのですが…多分。型が暗黙に色々といじくられてしまう言語は、多分「プログラマの脳内でも自動補完」がなされてしまい、結果的に物凄いことが時々起きます。
直接的具体的には、こんな事象でした。
ビットマスク関連の計算がありまして。「1バイト値のうち、上位nビットを残し、それ以下をマスクする」系の処理を連想してください。
例えばnが4であれば、1111 0000(0xf0)を、目的とする値にぶつけて論理演算すればよいのですが。
ここで、間違えて
とやってしまいました。
$base_num = "11110000";
これ以外にも。例えば"0"というものを見たときに、スクリプトではこれを「数字」としても「数値」としても扱えてしまいます。でも、実際には数値と数字はまったく違うものです。
数値は「値」であり、メモリの中に格納されている実際の値です。
数字は「文字」であり、それは「ある値を文字としてあらわしたときに出てくるもの」です。
…マシン語でVRAMとかやってるとよくわかるんですけどねぇ(苦笑
多分、ここを読んでる人の多くは「わかっている」ことだと思うのですが。あなたが「教えている」人はちゃんと理解できてますか?
…っていうのを、自戒を込めて書いてます(笑
えっと…本気でメモなのですが。
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);
ちょいとCGI.pmのparamメソッドを調べていて見つけたのですが。
関数 wantarray
実行中の関数の「戻り値」として配列値を要求していれば true を、スカラー(単項目 通常の$で始まる変数)を要求していればfalseを返す。
…すごいなぁ。「戻り値」の形の判断をするってあたりが。
例題。
sub foo
{
if (wantarray) {
# 配列復帰としての処理
} else {
# スカラー復帰としての処理
}
}
なんて関数を用意すると、
@data = foo();
なら配列復帰処理のifブロックが反応して、
$data = foo();
ってするとスカラー復帰処理のifブロックが反応するです。
………便利っちゃぁ便利だけど。多言語との移植性その他考えると、乱用は考えものだなぁ。
まぁ一応チェック入れておくですって感じで。
本気でメモですが。
# 10 -> 16
16進数 = sprintf("%x", 10進数);
# 16 -> 10
10進数 = hex(16進数);
…関数化しなくてもいいかなぁな分量の内容なので、メモります(笑