- 追加された行はこの色です。
- 削除された行はこの色です。
[[Language]]
#contents();
#ls2(Lang/Perl/);
////////////////////////////////////////////////////////////////////////////////
* 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;
push (@HOSTS, \%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;
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にコピー [#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]
////////////////////////////////////////////////////////////////////////////////
** 基本事項 [#h1e888f5]
- 配列の要素数
-- 配列をスカラに代入すると得られる。
$num = @array; # 配列 @array の要素数が $num に入る
- 配列の最後のindex番号
-- &color(#ff0000){$#};配列名とすると、その配列の最後のindex番号が得られる。
$#array # 配列 @array の最後のindex番号を表す。
////////////////////////////////////////////////////////////////////////////////
** 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);
////////////////////////////////////////////////////////////////////////////////
* 外部プログラム呼出 [#s0f44447]
** 返り値を得たい場合 [#cef38dbb]
$ret = system ("呼び出すコマンド");
- この $ret のように、サブプロセスの返り値の場合、"<< 8" された値になっているので、正しい値を得るには、以下のようにしてやる必要がある:
$ret = $ret >> 8;;
** 呼び出したコマンドのプロセスに入力値を与えたい場合 [#j48e4f5c]
if (!open (PROG, "| 呼び出すコマンド")) {
print "open error\n";
}
print PROG "送りたいデータ";
・・・・
close (PROG); # 最後の後始末
////////////////////////////////////////////////////////////////////////////////
* 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;
** ファイルテスト [#c2a19583]
|~演算子 |~説明|
|-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起動時における、ファイルの作成時刻からの日数|
- 使用例
if (-e $file_name) {
# ファイルが存在した場合の処理を記述
}
////////////////////////////////////////////////////////////////////////////////
** ファイル属性の取得 [#a1fcdaee]
- 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] |
////////////////////////////////////////////////////////////////////////////////
* 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]
- スクリプトファイル自体の文字コードを utf-8 にしておく。
- 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";