1sec 未満の sleep†
Perlでハッシュ†
hashを宣言(?)する†
my %aaa = ( 'ip' => '192.168.0.1',
'host' => 'foo' );
hashの中身を参照する†
$aaa{'ip'}
hashを配列にする†
配列の中身を見る†
配列に入れたhashの中身を更新する†
- たとえば、
foreach $x (@XXX) {
my (%host) = ('IP' => "0.0.0.0", 'host' => "host_$x" );
# $HOSTS[$#HOSTS+1] = \%host;
push (@HOSTS, \%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にコピー†
参考URI†
配列要素の操作†
基本事項†
sort†
挿入・削除†
※arrayの要素がhashであっても大丈夫。
時間関数†
経過日数の計算†
- 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);
外部プログラム呼出†
返り値を得たい場合†
$ret = system ("呼び出すコマンド");
- この $ret のように、サブプロセスの返り値の場合、"<< 8" された値になっているので、正しい値を得るには、以下のようにしてやる必要がある:
$ret = $ret >> 8;;
呼び出したコマンドのプロセスに入力値を与えたい場合†
if (!open (PROG, "| 呼び出すコマンド")) {
print "open error\n";
return;
}
print PROG "送りたいデータ";
・・・・
close (PROG); # 最後の後始末
呼び出したプログラムの出力を得たい場合†
if (!open (PROG, "呼び出すコマンド |")) {
print "open error\n";
return;
}
my (@out) = <PROG>; # 複数行の出力も全て、配列 @out に格納する。
close (PROG);
File I/O†
ファイルの copy, rename†
ディレクトリの読み込み†
- 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;
ファイルテスト†
演算子 | 説明 |
-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起動時における、ファイルの作成時刻からの日数 |
カレントディレクトリの取得†
ファイル属性の取得†
- stat 関数を使う。
@INFO = stat( $file );
ファイルシステムのデバイス情報 | $INFO[0] |
Iノード番号 | $INFO[1] |
ファイルモード(パーミッション等) | $INFO[2] |
対象ファイルのリンク数 | $INFO[3] |
対象ファイルの所有書のユーザID | $INFO[4] |
対象ファイルのグループのグループID | $INFO[5] |
デバイス識別子 | $INFO[6] |
ファイルサイズ(バイト数) | $INFO[7] |
最終アクセス時間 | $INFO[8] |
最終変更時間 | $INFO[9] |
最終 I ノード変更時間 | $INFO[10] |
最適ブロックサイズ | $INFO[11] |
割当てられているブロック数 | $INFO[12] |
Read/Write†
簡単なread†
if (!open (FILE_HANDLE, $file_name)) {
die "file open error: $file_name\n";
}
my (@lines) = <FILE_HANDLE>; # ファイルの全ての行を一気に @lines に読み出し
close (FILE_HANDLE); # 読みだしたので、close
foreach $line (@lines) {
# 処理を記述
}
- 長所
- 全ての行が一つの配列に格納されるため、読み出し後、行単位でランダムアクセスが出来る
- すぐにclose出来る
- 短所
- 読みだすファイルが巨大な場合、メモリ不足に陥り正常に処理終了出来ない場合がある。
大容量ファイルも読み込めるread†
if (!open (FILE_HANDLE, $file_name)) {
die "file open error: $file_name\n";
}
while ($line = <FILE_HANDLE>) { # 1行ずつ読み出して逐次処理する。
# 処理を記述
}
close (FILE_HANDLE); # 読みだしたので、close
Unicodeの使用†
参考サイト†
ひとまず†
- スクリプトファイル自体の文字コードを utf-8 にしておく。
- Unicodeを使えるように宣言しておく。
use utf8;
use Encode;
文字列処理†
split() : 区切り文字によるフィールド分割†
- 書式:
@dst = split (/$splitter/, $src);
@dst : 区切り文字で分割された各フィールドが配列として格納される先。区切り文字は除去して格納される。
$splitter : Tab区切りの場合はTab(\t)
SPACE区切りの場合は SPACE( )
コンマ区切りの場合はコンマ(,)
...といった具合に指定する
$src : 区切り文字でフィールドが区切られた文字列。
呼び出し元関数名を取得する†
コメント†