![]() |
|||||||||
![]() |
![]() |
PERL の変更点
#author("2021-06-04T04:05:19+00:00","default:pentacle","pentacle")
* 基本で忘れやすい構文 [#gd707192]
** init hash [#cb31df2e]
%hash = ("key"=>"value");
※ HASH でも () を使う。{}とかに間違えやすいので注意
** ヒアドキュメント [#w67d211b]
$html =<< "_HTML_";
<html>
<body>
hello
</body>
</html>
_HTML_
** switch case [#qe33e8fd]
#pre{{
use Switch;
switch ($val) {
case /abc/ { print "1\n"; }
case /def/ { print "2\n"; }
case /ghi/ { print "3\n"; }
else { print "0\n"; }
}
}}
** date [#ka49e726]
($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime(time());
printf("%04d/%02d/%02d %02d:%02d:%02d\n",$year+1900,$month+1,$mday,$hour,$min,$sec);
** stat [#r1308c38]
($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
$atime, $mtime, $ctime, $blksize, $blocks) = stat($file);
[0] DEV
[1] ino
[2] mode
[3] nlink
[4] uid
[5] gid
[6] rdev
[7] size
[8] atime
[9] mtime
[10] ctime
[11] blksize
[12] blocks
** ファイルテスト演算子 [#a39f08c1]
-r 読み込み可能
-w 書き込み可能
-x 実行可能で
-o 実行者とファイルの所有者が同一
-R 実uid/gidで読み込み可能
-W 実uid/gidで書き込み可能
-X 実uid/gidで実行可能
-O 実uidとファイルの所有者が同一
-e ファイルが存在する
-z ファイルサイズが 0
-s ファイルサイズが 0 以外(大きさを返す)
-f ファイルは通常ファイル
-d ファイルはディレクトリ
-l ファイルはシンボリックリンク
-p ファイルは名前付きパイプ
-S ファイルはソケット
-b ファイルはブロック型の特殊ファイル
-c ファイルはキャラクタ型の特殊ファイル
-t ファイルハンドルが tty としてオープンされている
-u ファイルの setuid ビットがセットされている
-g ファイルの setgif ビットがセットされている
-k ファイルの sticky ビットがセットされている
-T ファイルがテキストファイル
-B ファイルがバイナリファイル
-M perl起動時における、ファイルの更新時刻からの日数
-A perl起動時における、ファイルの参照時刻からの日数
-C perl起動時における、ファイルの作成時刻からの日数
*** 配列の要素数 [#fbaa3e0b]
$#hoge;
* CGI関連 [#xce37560]
** CGI.pm [#jca91239]
use CGI;
$cgi = CGI->new;
foreach $key ($cgi->param()){$param{$key} = $cgi->param($key);}
foreach $line (@ARGV){@pair = split(/=/,$arg);if ($pair[1]){$param{$pair[0]} = $pair[1];}}
print $cgi->header(-charset=>'euc-jp');
*** urlencode [#zf6ca690]
#include(urlencode);
* File Path 関連 [#s6b146b3]
** basename [#f2667c1c]
ファイルのパスを分解して、ファイル名だけとか、ディレクトリとかを得る
use File::Basename;
($name,$path,$suffix) = fileparse($fullname,@suffixlist)
fileparse_set_fstype($os_string);
$basename = basename($fullname,@suffixlist);
$dirname = dirname($fullname);
※ こうなる
$a = dirname("/aaa/bbb/ccc/");
$a : /aaa/bbb/;
$a = basename("/aaa/bbb/ccc/");
$a : ccc
($name,$path,$suffix) = fileparse("lib/File/Basename.pm",".pm");
fileparse_set_fstype("VMS");
$basename = basename("lib/File/Basename.pm",".pm");
$dirname = dirname("lib/File/Basename.pm");
参考:http://www.att.or.jp/perl/man/basename.3pm.html
** canonical name (フルパスを得る) [#k1f75291]
use FindBin;
my $script_dir = $FindBin::Bin;
sub canonical{
my $filename = shift;
if (($filename !~ m|^/|) && ($filename !~ m|^.:|)){
$cwd = `/bin/pwd`;
$cwd =~ s/[\r\n]//g;
if ($cwd =~ m|^/home|){
$cwd = "c:/cygwin$cwd";
}
$filename = "$cwd/$filename";
}
my @components = ();
foreach $component (split('/',$filename)){
if ($component eq "" ){ next; }
if ($component eq "." ){ next; }
if ($component eq ".." ){
pop (@components);
next;
}
push(@components,$component);
}
$filename = "/".join('/',@components);
# ドライブレターの場合は / を削除
if ($filename =~ m|^/.:|){
$filename =~ s|^/||;
}
# ネットワークファイルの場合は / を追記
if ($filename =~ m|^/\d+\.\d+\.\d+\.\d+/|){
$filename = "/$filename";
}
return $filename;
}
* エクセルリーダ [#zf5a20bd]
#!/usr/bin/perl
print "Content-type: text/html;\r\n\r\n";
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan2;
$xls_url = "http://hoge.com/hogehoge.xls";
`wget -q -Y off \"$xls_url\" -O /tmp/tmp.xls`;
my $oExcel = new Spreadsheet::ParseExcel;
my $oFmtJ = Spreadsheet::ParseExcel::FmtJapan2->new(Code => 'euc');
my $oBook = $oExcel->Parse('/tmp/tmp.xls', $oFmtJ);
system("rm /tmp/tmp.xls");
if(defined $oBook) {
for(my $iSheet=0; $iSheet < $oBook->{SheetCount} -1; $iSheet++) {
$oWkS = $oBook->{Worksheet}[$iSheet];
for(my $iR = $oWkS->{MinRow} ;
defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) {
for(my $iC = $oWkS->{MinCol} ;
defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++) {
$oWkC = $oWkS->{Cells}[$iR][$iC];
print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
}
}
}
}
*** package [#sca7840c]
package を使うとその前で宣言された変数はキャンセルされてしまう・・
*** jpeg titler [#h79903ef]
&attachref(jpegread.pl);
* suidperl [#mde39551]
*** 汚染回避 [#p475e940]
$val = ~m/(.*)/;
$val = $1;
※本当はちゃんとチェックしなくてはいけない。
* UDP socket client [#y7d20ba2]
#!/usr/bin/perl
use Socket;
socket(SOCKET, PF_INET , SOCK_DGRAM , 0);
$add .= chr(192);
$add .= chr(168);
$add .= chr(11);
$add .= chr(255);
$sock_addr = pack_sockaddr_in(4000,$add);
send(SOCKET , "hello" ,0,$sock_addr);
* UDP socket server [#y00b0f48]
#!/usr/bin/perl
use Socket;
socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
bind(SOCKET, pack_sockaddr_in(4000, INADDR_ANY));
while (1){
recv(SOCKET, $buf, 10000, 0);
printf "$buf\n";
}
* TCP Socket Client [#k8cc1e32]
#pre{{
#!/usr/bin/perl
use Socket;
use FileHandle;
$ip = '192.168.0.100';
$port = 80;
$ip = inet_aton($ip) || die "inet_aton";
$sockaddr = pack_sockaddr_in($port , $ip);
socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die "socket error.\n";
connect(SOCKET, $sockaddr) || die "connect $con_host $con_port error.\n";
autoflush SOCKET (1);
print SOCKET "file://test.ts\n\n";
while (chomp($buf=<SOCKET>)) {
print "$buf\n";
}
close(SOCKET);
}}
* TCP socket server[#sf45c526]
#!/usr/bin/perl
use Socket;
$port = 4321;
socket( CLIENT_WAITING, PF_INET , SOCK_STREAM , 0);
setsockopt(CLIENT_WAITING , SOL_SOCKET ,SO_REUSEADDR, 1);
bind (CLIENT_WAITING, pack_sockaddr_in($port,INADDR_ANY));
listen(CLIENT_WAITING , SOMAXCONN);
print "$port を見張ります\n";
while(1){
$paddr = accept(CLIENT, CLIENT_WAITING);
($client_port , $client_iaddr) = unpack_sockaddr_in($paddr);
$client_ip = inet_ntoa($client_iaddr);
print "$client_hostname ($client_ip) $client_port \n";
select(CLIENT);
$|=1;
select(STDOUT);
while(<CLIENT>){
print "$_";
print CLIENT $_;
}
close(CLIENT);
print "end\n";
}
* BOOK MARK [#vb0e6e02]
- perl 表技集
http://www2u.biglobe.ne.jp/~MAS/perl/waza/menu.html
* code [#m510c7f8]
*** file handler [#me68ae7d]
#pre{{
#!/bin/perl
@fhs = ();
for ($i=0;$i<16;$i++){
$file = sprintf("file_%x",$i);
open(${$file},">> $file");
push(@fhs, ${$file});
}
for ($i=0;$i<16;$i++){
printf ${$fhs[$i]}("%x\n",$i);
}
for ($i=0;$i<16;$i++){
close( ${$fhs[$i]} );
}
}}
*** snipet [#na5c497c]
#pre{{
#!/bin/perl
use Time::Local;
while(<>){
$line=$_;
$line=~s/[\r\n]+//g;
}
1;
sub command{
my ($com) = shift;
print "> $com\n";
$result = `$com`;
return $result;
}
sub date2unix{
my $line=shift;
$line=~s/[\/\-:\s ]//g;
$line=~m/(\d{4})(\d{2})(\d{2})(\d{0,2})(\d{0,2})(\d{0,2})/;
my ($yy,$mm,$dd,$hh,$mi,$ss) = ($1,$2,$3,$4,$5,$6);
$mm --;
return timelocal($ss,$mi,$hh,$dd,$mm,$yy-1900);
}
sub unix2date{
my $epoc=shift;
my $format=shift;
unless ($format){$format = "%04d-%02d-%02d %02d:%02d:%02d"};
my ($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($epoc);
$year += 1900;
$month ++;
return sprintf($format,$year,$month,$mday,$hour,$min,$sec);
}
}}
|
|||||||