Perl用こぴーあんどぺーすとライブラリ
これは私(小菅)がPerlでプログラムを書くときに良く使う口癖のようなものです。^^;
「ライブラリを作らなくても"Copy & Paste"で貼り付けちゃえば
いいかぁ」と言うのがこのページのコンセプトです。
中には使い方の誤ったものもあると思います。以下を真似していただいても
良いですが、その事によりトラブルが発生しても一切、責任は負いません。^^;
また、「こんな使い方は間違いだぁー」と間違いを発見した方は是非ご連絡下さい。
Takashi Kosuge <takashi.kosuge@kek.jp>
Yes/Noの入力を求めて結果を返す
$rt = yesno("Ok?"); #Default is no.
$rt = yesno("Ok?",1); #Default is yes.
sub yesno{
my $comment = shift;
my $default = shift;
if($default){
$comment .= " ([y]/n)> ";
}else{
$comment .= " (y/[n])> ";
$default = 0;
}
my $prv = $|;
$| = 1;
print $comment;
$| = $prv;
my $ans = <STDIN>;
chomp($ans);
$ans = uc($ans);
if($ans eq 'Y'){
return(1);
}elsif($ans eq 'N'){
return(0);
}
return($default);
}
オプション入力
use Getopt::Long;
# Options ---------------------------------------------------
GetOptions(
'd' => \$::Debug,
'file=s' => \$::Filename,
'n=i' => \$::Number,
'h' => \&usage,
) or die "Bad switch.\n";
# Print usage. ---------------------------------------------
sub usage{
print <<__USAGE__;
$0 $::Version
Usage: $0 [-h] [-d] [-file FileName]
-h Show this help.
-d Run with debug mode.
-file FileName Set file name.
-i Number.
__USAGE__
exit(0);
}
TCP/IP Socket のオープン(クライアント)
use IO::Socket;
my $host='.jp';
my $port=0;
my $server =
new IO::Socket::INET(PeerAddr=>$host, PeerPort=>$port, Proto=>'tcp')
||die "Socket: $@\n";
Socketで相手のホスト名を得る関数
(分からなかったらIPアドレスを返す)
#-- Get Hostname -----------------------------------------------
sub ksg_gethost{
my $s = shift(@_);
my $host = gethostbyaddr($s->peeraddr(), AF_INET);
unless($host){$host = $s->peerhost();}
return($host);
}
Symbolとgensym()を使ってファイルを開く
use Symbol;
my $fh = gensym(); open($fh,"filename");
"yyyy-mm-dd hh:mm:ss" 形式で日付(local time)を返す関数
#-- Get "yyyy-mm-dd hh:mm:ss" style date -------------------------
sub ksg_localtime{
my $tm = shift(@_);
if($tm eq ''){$tm=time();}
my @tt = localtime($tm);
return(sprintf("%04d-%02d-%02d %02d:%02d:%02d",
$tt[5]+1900,$tt[4]+1,$tt[3],$tt[2],$tt[1],$tt[0]));
}
"yyyy-mm-dd hh:mm:ss" 形式から(timelocal)を返す関数
#hh:mm:ss 又は :ss の部分は省略できる。なお、以下のようにTime::Localが必要。
use Time::Local;
#-- Get seconds from 1970-01-01 00:00:00 (GMT) -------------------
sub ksg_timelocal{
my $bf=shift(@_);
my($sec,$min,$hours,$mday,$mon,$year);
if($bf=~/^(\d\d\d\d)[\-\/](\d+)[\-\/](\d+)$/){
$sec = 0;
$min = 0;
$hours = 0;
}elsif($bf=~/^(\d\d\d\d)[\-\/](\d+)[\-\/](\d+)\s+(\d+):(\d+)$/){
$sec = 0;
$min = $5;
$hours = $4;
}elsif($bf=~/^(\d\d\d\d)[\-\/](\d+)[\-\/](\d+)\s+(\d+):(\d+):(\d+)$/){
$sec = $6;
$min = $5;
$hours = $4;
}else{(return(-1));}
$mday = $3;
$mon = $2-1;
$year = $1-1900;
return(timelocal($sec,$min,$hours,$mday,$mon,$year));
}
プロセスなどを排他ロックするためのサブルーチン
#LOCKIDには識別の為の名前を設定、LOCKDIRはロックファイルを作るディレクトリ。
ロックできれば1をできなければnull文字を返す。$::Errorにエラー内容が
セットされる。
use constant LOCKID => 'webup';
use constant LOCKDIR => '/tmp/';
##Sub for lock precess##
##Lock##
sub lock_proc{
my $prelock= LOCKDIR.LOCKID."$$.tmp";
my $lock = LOCKDIR.LOCKID.".lock";
if(-e $prelock){
$::Error = 'ID "'.LOCKID
.$$.'" is being locked by other process.';
return('');
}
unless(open(BUFFFORPROCESSLOCK,">$prelock")){
$::Error ='Could not open prelock file.';
return('');
}
print BUFFFORPROCESSLOCK "$$\n";
close(BUFFFORPROCESSLOCK);
unless(-e $lock){
rename($prelock,$lock);
return(1);
}
unlink($prelock);
$::Error = 'ID "'.LOCKID.'" is being locked by other process.';
return('');
}
##unlock##
sub unlock_proc{
my $lock = LOCKDIR.LOCKID.".lock";
my $buff ='';
unless(-e $lock){
$::Error='Lock file is not found.';
return('');
}
open(BUFFFORPROCESSLOCK,"$lock");
$buff=<BUFFFORPROCESSLOCK>;
chop($buff);$buff=~s/\r//;
close(BUFFFORPROCESSLOCK);
if($buff != $$){
$::Error = 'ID "'.LOCKID.'" is being locked by other process.';
return('');
}
unlink($lock);
return(1);
}