[[Language]] #contents //////////////////////////////////////////////////////////////////////////////// * 1sec 未満の sleep [#s1414a2e] - 1sec未満の sleep をするには、sleep ではなく、select を使用する。 select undef, undef, undef, 0.5; # 0.5sec の sleep //////////////////////////////////////////////////////////////////////////////// * Perlでハッシュ [#b6565f40] ** hashを宣言(?)する [#o111d4f1] my %aaa = ( 'ip' => '192.168.0.1', 'host' => 'foo' ); ** hashの中身を参照する [#r9e8457e] $aaa{'ip'} ** hashを配列にする [#k47bc7e1] - hashを配列にするには、配列の要素となるhashを1個、ループ内において my で宣言しておき、これに値を入れ、配列に入れる。 for ($i = 0; $i <= $#A_ARRAY; $i++) { my %aaa = ( 'ip' => "192.168.0.$i", 'host' => "host_$i" ); # <--- ループ内で my で宣言するのがミソ $aaa{'ip'} = $new_ip; $HOSTS[$#HOSTS+1] = \%aaa; } ** 配列の中身を見る [#xc01f65a] - 上で作ったhashの配列の中身を見るには、以下のようにすればOK。 foreach $h (@HOSTS) { print "ip: $h->{'ip'}\n"; } ** 配列に入れたhashの中身を更新する [#daf96c11] - たとえば、 foreach $x (@XXX) { my (%host) = ('IP' => "0.0.0.0", 'host' => "host_$x" ); $HOSTS[$#HOSTS+1] = \%host; } のようにして作ったhash配列 @HOSTS に対して、その$i番目の中身を更新するには (1) : $HOSTS[$i]->{'IP'} = "192.168.0.1" # これでは更新出来ない。 (2) : my (%h) = $HOSTS[$i]; $h{'IP'} = "192.168.0.1"; $HOSTS[$i] = \%h # これでなら更新出来る。 ** hashを別のhashにコピー [#t1bc7fcc] - 丸ごとコピー出来る。 %aaa = ( 'val1' => 10, 'val2' => 100 ); %bbb = %aaa; ** 参考URI [#c21d8467] - [[Perlについて構造体配列を宣言&使いたい。>http://www.rescue.ne.jp/CGI-BBS/cgi/perl/20030507180401.shtml]] - [[cの構造体vsPerlのハッシュ>http://www.geocities.co.jp/SiliconValley-Sunnyvale/6128/perl/structhash.html]] - [[Class::Struct>http://www2u.biglobe.ne.jp/~MAS/perl/waza/struct.html]] //////////////////////////////////////////////////////////////////////////////// * 配列要素の操作 [#v7d5d906] //////////////////////////////////////////////////////////////////////////////// ** sort [#gcd11b25] - 辞書順 @dest = sort { $a cmp $b } @src; # 順方向 @dest = sort { $b cmp $a } @src; # 逆方向 - 値順 @dest = sort { $a <=> $b } @src; # 順方向 @dest = sort { $b <=> $a } @src; # 逆方向 - hash配列も特定の値でsort出来る @dest = sort { $a->{'VarName'} <=> $b->{'VarName'} } @src; # 順方向 //////////////////////////////////////////////////////////////////////////////// ** 挿入・削除 [#u287eeb9] - 配列の最後に要素を挿入 push (@dst, $add) @dst: 挿入先配列, $add: 挿入する値 - 配列の最後から要素を削除 $deleted = pop (@src) @src: 取り出し元配列。実行後は $deletedが取り除かれた配列になっている $deleted: @srcの最後から取り出した要素 - 配列の先頭に要素を挿入 unshift (@src, $add) @dst: 挿入先配列, $add: 挿入する値 - 配列の先頭から要素を削除 $deleted = shift (@src) @src: 取り出し元配列。実行後は $deletedが取り除かれた配列になっている $deleted: @srcの先頭から取り出した要素 ※arrayの要素がhashであっても大丈夫。 //////////////////////////////////////////////////////////////////////////////// * 時間関数 [#ef88b2b5] - [[経過日数の計算>http://cocohome.hp.infoseek.co.jp/cocohome/l_nisukeisan.html]] - Time::Local を利用する。 - 例:現在から丁度10日と2時間後の日時を得る use Time::Local; # timelocal() my($sec,$min,$hour,$mday,$mon,$year); # 普通は localtime(time) の返り値を代入するが、ここは例示なので具体的な日付けで ($year,$mon,$mday,$hour,$min,$sec) = (2009,01,01,12,00,23); #2009年1月1日12時0分23秒 # perlの常識ながら、$monは0オリジン、$yearは1900オリジンなので、人間が使う値が入っている場合には、当然引き算が必要 my ($time_local) = timelocal ($sec,$min,$hour,$day,$mon-1,$year-1900); # 上で得られた $time_local は、基準日時(1970年01月01日で0時0分0秒)からの秒数になっている。 # であるから、ここから更に「10日と2時間」を秒数に換算したものを加えると、 $time_local += (10 * 24 * 60 * 60) + (2 * 60 * 60); # 以下で得られる $res_* に入る値が、求める日時である。 my ($res_sec,$res_min,$res_hour,$res_mday,$res_mon,$res_year,$res_wday,$res_yday,$res_isdst) = localtime($time_local); //////////////////////////////////////////////////////////////////////////////// * File I/O [#l78587ba] ** ファイルの copy, rename [#x409af09] - ファイルの copy rename には、 File::Copy を使う。 use File::Copy; copy("コピー元のファイル名", "コピー先のファイル名"); # ファイルのcopy move("移動元", "移動先"); # ファイルのrename ** ディレクトリの読み込み [#nc7671b7] - opendir, readdir, closedir を使う。割と普通なやり方。 my ($dir) = './data'; if (!opendir (DIR, "$dir")) { die "Could not open dir: $dir\n"; } my (@read_tmp); while (defined($ent = readdir(DIR))) { if (($ent =~ /^\.$/) || ($ent =~ /^\.\.$/)) { next; } # $read_tmp[$#read_tmp+1] = $ent; # $read_tmp[$#read_tmp+1] = "$dir/$ent"; push (@read_tmp, "$dir/$ent"); } closedir(DIR); # 思った通りの並びで読み取ってくるわけではないので、sort しておいた方がいい場合もある。 my (file_entries) = sort { $a cmp $b } @read_tmp; //////////////////////////////////////////////////////////////////////////////// * Unicodeの使用 [#bb6eec79] ** 参考サイト [#b17497bd] - [[PelleasのBlog>http://pelleas.cocolog-nifty.com/blog/cat7921558/index.html]] - [[Perl 5.8.x Unicode関連>http://www.rwds.net/kuroita/program/Perl_unicode.html]] - [[Perlによる日本語コード変換のメモ(第二版)>http://www.hikoboshi.org/perl/utf8.html]] - [[perl5.8のUnicodeサポート>http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html]] ** ひとまず [#m4b559b3] - Unicodeを使えるように宣言しておく。 use utf8; use Encode; - 入力/出力をutf-8にするには、この様に宣言しておく。 binmode(STDIN,":utf8"); binmode(STDOUT,":utf8"); //////////////////////////////////////////////////////////////////////////////// * コメント [#dcfabb6f] - 行単位のコメントは、半角 "#" print "Hello World.\n"; # これより右側はコメント - 複数行をコメントアウトする -- 開始記号: =pod -- 終了記号: =cut =pod ここは、コメントになる =cut print "Hello World.\n";