Mixtype

あのおじさんも使ってるPerl講座例文紹介サイト

Mixtype No.9 Last Update On 2015-02-08 2009 perl

あのおじさんも使ってるPerl講座例文紹介サイト

Mixtype No.9 Last Update On 2015-02-08 2009 perl
Perl講座を扱っているサイトは数あれど、その大部分は基本的なリファレンス集や用語解説が主で、「これをするにはこう書いたらいいよ!」と言うような、実践的な例文を親切に掲載しているサイトが見つからないものです。
先日、私も探していたのですが、探し方が悪いのかなかなか例文が見つからずに、やっと見つけました。

beginners CGI

このサイトのCGI作成ヒント集を見つけた時は、そうなんだ!こういうのが欲しかったんだ!と歓喜しました。
基本的な事柄から順序良く勉強していけば、これくらい朝飯前になれるのだろうけれど、まず先にやりたいことがあって、それをするにはどうすればいいの?と言うような場当たり的な勉強をしている私にはとても有難いサイトでした。また、こちらのサイト(萌えPerl)は、ひとつひとつが細かく説明してあり、わかりやすいです。

ちなみに今回勉強して完成したのは、ループ制御コマンドのlastを使った構文で、ログデータの中から、ある言葉に該当する配列を選び出し、その選んだ配列の中の最初の配列を整形して表示すると言う感じです。この構文を使ってこのサイトの以前のカテゴリ部分が出来ていました。



構文を組むポイントは、ある言葉に該当する配列のうち、二番目に該当する配列の時にlastを使ってループから脱出することです。lastを使うことで、二番目の配列の内容を表示せずに、ループから脱出するため、最初に該当した配列のみを表示することが出来るようになります。
その部分の例文を書くと、、、
if($hoge eq 'kotoba'){last;}

と言う感じになります。


【文字コードをsjisからeucjpにエンコード】
RSSを出力する際、sjisのままではエラーを吐くので
use Jcode;
$sub_encode = Jcode::convert( "$sub", "eucjp", "sjis" );

とすると文字コードをsjisからeucjpに変換することが出来ます。


【番号を3桁に変換する。「1」を「001」に】
「sprintf」関数を使います。
$num3 = sprintf( "%03d", $num );

尚、%03dのところを、%02dにすれば2桁、%04dにすれば4桁になります。


【ASCII文字コード:16進 %3D %3F %2F %23】

普通の文字
記号 Shift Ctrl Alt Shift Ctrl Alt
, 2C < 3C -- 3300 @ 40 ` 60 -- 1A00
- 2D = 3D 1F 8200 [ 5B { 7B 1B 1B00
. 2E > 3E -- 3400 \ 5C | 7C 1C --
/ 2F ? 3F -- 3500 ] 5D } 7D 1D 2B00
: 3A * 2A -- 2800 ^ 5E ~ 7E -- 8300
; 3B + 2B -- 2700

数字 Shift Ctrl Alt Shift Ctrl Alt
0 30 0B00 -- 8100 5 35 % 25 -- 7C00
1 31 ! 21 -- 7800 6 36 & 26 1E 7D00
2 32 " 22 0300 7900 7 37 ' 27 -- 7D00
3 33 # 23 -- 7A00 8 38 ( 28 -- 7F00
4 34 $ 24 -- 7B00 9 39 ) 29 -- 8000



【最後のインデックスの数値を調べる】(参考
「$#配列名」 という表記は、配列の最後のインデックスの数値を表します。
配列のインデックスは0から始まるので、配列の要素よりも1つ小さい値になります。
「$#配列名」 に代入することにより、配列の要素数を小さくしたり、空にしてしまうこともできます。

例えば
$data[$#data]
とすればこれは、配列$dataの総数(仮に5)から-1した数(ならば4)となる。

0:あいうえお
1:かきくけこ
2:さしすせそ
3:たちつてと
4:なにぬねの

だから、例えばforを使って
for(0..$data[$#data])

とすると、$data[$#data]の値は4となるが、繰り返しを4回ではなくて
0から4までを行えと言う風に使うことができる。

つまり、ここが違うのではなくて、
ナンバーのないところまで書き換えてしまっている(何度も上書きを行ってる)。
だから、ifでナンバーのないとこまで来たら、lastで脱出が最善なのではないか。


【ログから該当する配列を検索し、指定した配列の前後のデータを表示する】
ログを反転(reverse)させたものと、反転させていないものとに分けて検索し抜き出せばよい。
つまり、
配列の番号が小さい順で検索して該当番号よりも大きくなったら抜き出していく。
→100番が該当番号ならば105,142,167・・・=100に近く100よりも大きい数字を抜き出せる。
配列の番号が大きい順で検索して該当番号よりも小さくなったら抜き出していく。
→100番が該当番号ならば95,70,54・・・=100に近く100よりも小さい数字を抜き出せる。
の2通り。