Perl忘備録
CGIプログラムの雛形
日付取得 &get_date(time); デコード &decode; クッキー取得 &get_cookie; ヘッダー出力 &header; コマンド分岐 それぞれの処理 フッター出力 &footer exit; サービス処理
正規表現
URLをリンクに変換 $logs[ $i ] =~ s/(http:\/\/[^ \"\r\n\<]+)/\<a href=\"$1\" target=\_blank\>$1\<\/a\>/g;
高速化
ループ
途中でlastでループを脱出して、高速回転 $flag=0; for($i=0;$i<=$#log;$i++) { if("$code\n" eq $log[$i] ) { $flag=1; last; } }マッチ
文字列比較は正規表現を使わないでindexで済ます方が高速
アクセス解析
IPアドレス取得 $ip = $ENV{'REMOTE_ADDR'}; リファーURL取得 $ref = $ENV{'HTTP_REFERER'}; 呼び出し側(JavaScript併用) <SCRIPT> document.write(<img src="ref.cgi?"+document.referrer+"' border=0>"); </SCRIPT>
ヘッダー出力
print "Content-Type: text/html\n\n"; print <<"END"; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>$title</title> <META http-equiv=Content-Type content=text/html;CHARSET=EUC-JP> <META http-equiv=Content-Style-Type content='text/css'> <link rel="stylesheet" href="css.txt" type="text/css" media="all"> </head> <body> END
文字変換
大文字を小文字へ $temp =~ tr/A-Z/a-z/;
文字種変換
require './jcode.pl'; EUCに変換 &jcode'convert(*temp, "euc"); SJISに変換 &jcode'convert(*temp, "sjis");
ソート
数値比較ソート @log = sort { $b <=> $a } @log; 文字列比較ソート @log = sort { $b cmp $a } @log;
リスト
リストの行数 $#log 上から削除 $temp = shift @log; 上に追加 unshift @log ,"$temp\n"; 下に追加 push @log ,"$temp\n"; 下から削除 $temp = pop @log; $num番目を1行削除 splice @log,$num, 1;
ランダム・メッセージ
@msg=( "ちょっとブルーな", "いつも空元気な", "最近、夢を見ない", "肩がこって仕方が無い", "お腹が一杯の", "笑いすぎて疲れた", "寒くて凍えている", "人の視線が気になる", "踊って歌える", "背が伸びなくて悩んでいる", "先月より1キロも太った", "落武者が怖くてしかたない", "あなたのハートを鷲づかみ" ); $res= $msg[ int(rand($#msg)) ]; print <<"END"; こんにちわ。$resあるみです END
フォーム
<form name=main method="post" a="$self"> <input type=text name=atime size=2> <select name=atime2> <option value=""></option> <option value="月">月</option> <option value="火">火</option> <option value="水">水</option> <option value="木">木</option> <option value="金">金</option> <option value="土">土</option> <option value="日">日</option> </select> <textarea cols=28 rows=5 name=text2></textarea> <input type="submit" value="登録"> </form>
デコード
sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'};} @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #HTMLタグを潰す $value =~ s/</</g; #文字種を変換 &jcode'convert(*value,'euc'); $FORM{$name} = $value; } }
日付取得
sub get_date { ($sec,$min,$hour,$day,$month,$year,$wday) = localtime($_[0]); $year += 1900; $month++; $date = sprintf("%2d\月%2d日",$month,$day); $time = sprintf("%2d\時%2d\分",$hour,$min); @weekly = ('日', '月', '火', '水', '木', '金', '土'); $week=$weekly[$wday]; }
クッキー
$cookname = 'ここにクッキー名';クッキー取得
sub get_cookie { @pairs = split(/\;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { local($name, $value) = split(/\=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/\,/,$DUMMY{$cookname}); foreach $pair (@pairs) { local($name, $value) = split(/\:/, $pair); $COOKIE{$name} = $value; } $key = $COOKIE{'key'}; }クッキー設定
sub set_cookie { # クッキーは90日間有効 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 90*24*60*60); $yearg += 1900; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; $cook = "key\:$value"; print "Set-Cookie: $cookname=$cook; expires=$date_gmt\n"; }![]()