Perl モジュール

CGI.pm

  • CGIの基本的な処理を行うためのモジュール。

パラメータの取得

# キー名 NAME のデータ取得
use CGI;
# CGI($ENV{'QUERY_STRING'})でGETメソッドからのみ取得
# CGI('name=alpha&message=omega')でユーザ指定からのみ取得
# 未指定の場合は(GET,POST,またファイル送信やコマンドラインからの入力も認識)
$q = new CGI();
# NAMEというキー名のパラメータ取得
$name = $q->param('NAME');

HTTP-Cookie の取得

use CGI;
$q = new CGI();
# NAME というキー名の HTTP-Cookie取得
$c_name = $q->cookie(-name=>'NAME');
print "Content-Type: text/plain\n";	# HTTP-Cookie の設定
print 'Set-Cookie: '.
	$q->cookie(-name=>'NAME',
	-value=>$c_name,
	-path=>'/cgi-bin/',
	-domain=>'www.foo.com',
	-expires=>'+1y')."\r\n";
print "\r\n";
print "Cookie Test";

Socket.pm

  • ソケットを利用した通信を行うモジュール。

WWWサーバからページを読み込む

#! /usr/local/bin/perl
use Socket;
($host,$path,$port) = @ARGV;
$addr = inet_aton($host); # ホスト→IPアドレス
$port = getservbyname('http','tcp') unless($port);
socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')) # ソケット作成
	or die "can't create socket";
connect(SOCKET, pack_sockaddr_in($port, $addr)) # 接続
	or die "can't connect $host:$port";
select((select(SOCKET),$|=1)[0]); # バッファリングOFF
# サーバにHTTPリクエストを送る
print SOCKET "GET $path HTTP/1.0\r\n";
print SOCKET "\r\n";
# サーバの応答をそのまま表示
print <SOCKET>;
close(SOCKET);

エコーサーバ

#! /usr/local/bin/perl
use Socket;
($host,$port) = @ARGV;
$addr = inet_aton($host); # ホスト→IPアドレス
$port = getservbyname('http','tcp') unless($port);
select((select(NEWSOCKET),$|=1)[0]); # バッファリングOFF
socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')) # ソケット作成
	or die "can't create socket";
bind(SOCKET,pack_sockaddr_in($port,'0.0.0.0'))
	or die "can't bind port:$port";
listen(SOCKET,3) #
	or die "can't listen";
select((select(SOCKET),$|=1)[0]); # バッファリングOFF
for($con=1 ;; $con++){
	printf("Listening for connection %d....\n",$con);
	($addr = accept(NEWSOCKET,SOCKET))
		or die "accept : $!";
	if(($child = fork()) == 0){
		print "accept ok\n";
		unpack_sockaddr_in($addr);
		
		
	}
}

プロトコル名を対応するプロトコル番号に変換する

($pname,$aliases,$pnum) = getprotobyname('tcp');
$pnum = getprotobyname('icmp');

プロトコル番号を対応するプロトコル名に変換する

($pname,$aliases,$pnum) = getprotobyname(6);
$pname = getprotobyname(1);

サービス(ポート)名を対応するポート番号に変換する

仕様
getservbyname( サービス名, プロトコル名 );
($sname,$aliases,$port,$pname) = getservbyname('http', 'tcp');
$port = getservbyname('ftp', 'tcp');

ポート番号を対応するサービス(ポート)名に変換する

仕様
getservbyport( ポート番号, プロトコル名 );
($sname,$aliases,$port,$pname) = getservbyport(80, 'tcp');
$sname = getservbyport(21, 'tcp');

ネットワークのホスト名を対応するIPアドレスに変換する。

IPアドレスはバイナリの4バイトのバイナリ構造体で扱う。

仕様
gethostbyname( ホスト名 );
($hname,$aliases,$addrtype,$length,@addrs) = gethostbyname('www.google.ne.jp');
$addr[0] = gethostbyname('www.google.ne.jp');
$addr_str = join('.',unpack('C4',$addr[0])); #バイナリのアドレスを変換

ネットワークのアドレスを対応するホスト名に変換する

IPアドレスはバイナリの4バイトのバイナリ構造体で扱う。

仕様
gethostbyaddr( IPアドレス}, &color(red){アドレスタイプ );
$addr = pack('C4',split(/\./,'127.0.0.1'));
($name,$aliases,$addrtype,$length,@addrs) = gethostbyaddr($addr, 2);
$name = gethostbyaddr($addr, 2);

Jcode.pm

Perlで日本語の変換などを行うためのモジュール。
標準モジュールの Encode.pm が使えるものの、
個人的にはこちらのほうが日本語に関しては柔軟性も使い勝手もよい。

use Jcode;
#文字化け防止のために内部ではEUCで処理するほうが望ましい

# z2h 全角カタカナを半角に変換
# h2z 半角カタカナを全角に変換
# sjis シフトJISコードに変換
# jis JISコードに変換
# euc EUCコードに変換
$string = jcode($string)->h2z->jis;

#↑とやってることは同じだが、
# こちらは$jオブジェクトを作ったので使いまわしができる。
$j = Jcode->new('あア亜A1'); #オブジェクト生成
$string = $j->z2h->jis;

jcode($string,'sjis'); #変換前の文字コードを明示。なければ自動判定
jcode($string,'sjis')->euc; #SJISじゃなくても無理矢理SJIS→EUC変換をする

#2バイト文字を含む文字の置き換え。使用方法はtrと同じ
#全角ひらがなを全角カタカナに置き換え
$string = jcode($string)->tr('ぁ-ん','ァ-ン');
$string = jcode($string)->tr('A-Z0-9','A-Z0-9');

Encode.pm

Perl5.8で標準搭載された変換モジュール。
各国語の言語処理に対応し、もちろん日本語にも使える

use Encode;	# Encode::JP
$euc_str = encode('euc-jp',$utf8_str);	#UTF-8をEUCに変換
$utf8_str = encode('euc-jp',$euc_str);	#EUCをUTF-8に変換

Jcode.pmとEncode.pmの比較

言語Jcode.pmEncode.pm
日本語EUCjcode($str)->eucencode('euc-jp',$str)
日本語シフトJISjcode($str)->sjisencode('shiftjis',$str)
日本語JISjcode($str)->jisencode('7bit-jis',$str)
Unicode-8jcode($str)->utf8encode('utf8',$str)
encode_utf8($str)
Unicodejcode($str)->ucs2encode('ucs2',$str)
全角にjcode($str)->h2zEncode::JP::H2Z::h2z($str)
半角にjcode($str)->z2hEncode::JP::H2Z::z2h($str)


use encoding "euc-jp"
print length('伊呂波');
# jperl のように全角文字も1つとして数える


ファイルの読み書き時に自動で文字コード変換する

# EUCのテキストファイルをシフトJISのテキストファイルにして書き出す
use Encode;
open(IN, '<:encoding(euc-jp)', 'euc.txt'); # EUCのテキストで読み込む
open(OUT, '>:encoding(shiftjis)', 'sjis.txt'); # SJISのテキストを書き込む
while(<IN>){
	print OUT;
}
close(IN);
close(OUT);

Time.pm

  • 時間関連モジュール
  • timelocal= 標準関数localtimeの逆変換。日時を入力してマシンタイム(秒表現)に変換する
    数値の扱いもlocaltime同様にクセがある
    $month は1〜12月を0〜11で入力、$yearは1900年からの年数、$wdayは日〜土曜が0〜6に対応
    use Time::Local;
    $time = timelocal($sec,$min,$hour,$mday,$month,$year,$wday,$isdst);

2006年12月5日0時0分0秒を表わすマシンタイム

$time = timelocal(0,0,0,5,12-1,2006-1900);

YYYY MM DD 日付をマシンタイムに変換(1900年以降のみ)

sub date2time{
	my($y,$m,$d) = @_;
	return($y < 1900 ? 0 : timelocal(0,0,0,$d,$m-1,$y-1900));
}

Compress::Zlib.pm

#GZipアーカイブ制御
use Compress::Zlib;

#gzファイルを開いて解凍した内容を出力
$gz = gzopen('testgzip.gz','rb');
while( ($len = $gz->gzread($_,1024)) ){ print; }
$gz->gzclose;

Net::Twitter

use Net::Twitter

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規新規下位 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-06-18 (木) 00:37:05 (3020d)