perl のファイルテスト演算子

-X FILEHANDLE
-X EXPR
-X A file test, where X is one of the letters listed below. This unary operator takes one argument, either a filename or a filehandle, and tests the associated file to see if something is true about it. If the argument is omitted, tests $_, except for
"-t", which tests STDIN. Unless otherwise documented, it returns 1 for true and '' for false, or the undefined value if the file doesn't exist. Despite the funny names, precedence is the same as any other named unary operator, and the argument may
be parenthesized like any other unary operator. The operator may be any of:

-r File is readable by effective uid/gid.
-w File is writable by effective uid/gid.
-x File is executable by effective uid/gid.
-o File is owned by effective uid.

-R File is readable by real uid/gid.
-W File is writable by real uid/gid.
-X File is executable by real uid/gid.
-O File is owned by real uid.

-e File exists.
-z File has zero size (is empty).
-s File has nonzero size (returns size in bytes).

-f File is a plain file.
-d File is a directory.
-l File is a symbolic link.
-p File is a named pipe (FIFO), or Filehandle is a pipe.
-S File is a socket.
-b File is a block special file.
-c File is a character special file.
-t Filehandle is opened to a tty.

-u File has setuid bit set.
-g File has setgid bit set.
-k File has sticky bit set.

-T File is an ASCII text file (heuristic guess).
-B File is a "binary" file (opposite of -T).

-M Script start time minus file modification time, in days.
-A Same for access time.
-C Same for inode change time (Unix, may differ for other platforms)

コンフリクトファイルの一覧が表示するコマンド.

git で merge やら, pull した時に, 大量にコンフリクトが発生してしまった..
どこから手を付けていこうか, コンフリクトファイル一覧を参照しながら作業したい.

そんな時はこのコマンド.

git ls-files -u

Ref.
http://iiidevelop.blogspot.jp/2011/08/git.html

map と grep の違い ~ 一目瞭然編 ~

my $array_ref = [
^---{id => 1, name => 'hoge', atk => 5, def => 8, hp => 10},
^---{id => 2, name => 'fuga', atk => 6, def => 9, hp => 13},
^---{id => 3, name => 'foo', atk => 7, def => 10, hp => 18},
^---{id => 4, name => 'aaa', atk => 8, def => 19, hp => 13},
^---{id => 5, name => 'aaa', atk => 8, def => 19, hp => 13},
^---{id => 6, name => 'aaa', atk => 8, def => 19, hp => 13},
^---{id => 7, name => 'aaa', atk => 8, def => 19, hp => 13},
^---{id => 8, name => 'bbb', atk => 9, def => 2, hp => 20},
^---{id => 9, name => 'bbb', atk => 9, def => 2, hp => 20},
^---{id => 10, name => 'bbb', atk => 9, def => 2, hp => 20},
^---{id => 11, name => 'bbb', atk => 9, def => 2, hp => 20},
];

my @map_array = map {$_->{atk}} @$array_ref;
my @grep_array = grep {$_->{atk}} @$array_ref;

print Dumper(\@map_array);
print Dumper(\@grep_array);

結果は当然こんなかんじに.

[map]
$VAR1 = [
5,
6,
7,
8,
8,
8,
8,
9,
9,
9,
9
];

map は配列に操作します.

一方, grep は,

[grep]
$VAR1 = [
{
'hp' => 10,
'def' => 8,
'atk' => 5,
'name' => 'hoge',
'id' => 1
},
{
'hp' => 13,
'def' => 9,
'atk' => 6,
'name' => 'fuga',
'id' => 2
},
{
'hp' => 18,
'def' => 10,
'atk' => 7,
'name' => 'foo',
'id' => 3
},
{
'hp' => 13,
'def' => 19,
'atk' => 8,
'name' => 'aaa',
'id' => 4
},
{
'hp' => 13,
'def' => 19,
'atk' => 8,
'name' => 'aaa',
'id' => 5
},
......つづく

つまり, 配列に何も操作しません.
そのまま全部垂れ流します.
grep はスクリーニングするのでした.(配列の長さが変えられます.)
よって正しい使用方法はこんなかんじ.

my @grep_array = grep {$_->{atk} > 8} @$array_ref;

Dumperで出力するとこんなかんじに.

$VAR1 = [
{
'hp' => 20,
'def' => 2,
'atk' => 9,
'name' => 'bbb',
'id' => 8
},
{
'hp' => 20,
'def' => 2,
'atk' => 9,
'name' => 'bbb',
'id' => 9
},
{
'hp' => 20,
'def' => 2,
'atk' => 9,
'name' => 'bbb',
'id' => 10
},
{
'hp' => 20,
'def' => 2,
'atk' => 9,
'name' => 'bbb',
'id' => 11
}
];

perl のファイルハンドルをつかって, ファイルに値を書き込む.

open FH, ">data.dat" or die;
print FH $data;
close FH;

注意点は2点
1. or を使う. (|| では優先度が高すぎるので, ">data.dat"が真なら(この場合必ず真)dieしない.)
2. ">data.dat" という形式. (">", "data.dat" の場合, or はどこと比較していいかわからず, エラーとなる)

解釈は間違っているかもしれません.
お気づきの方は, ご指摘くださいませ.

INSERT IGNORE, UPDATE IGNORE の意味.

多くのレコードの INSERT でキーワード IGNORE が指定されていると、テーブルの既存の PRIMARY または UNIQUE キーと重複するレコードはすべて無視され、挿入されない。IGNORE が指定されていない場合に既存のキー値を重複して持つレコードがあると、挿入処理が中断される。C API 関数 mysql_info() では、テーブルに挿入されたレコード数を調べることができる。

プライマリーキーやユニークキーの重複 insert, update を無視してくれるのが "IGNORE" オプションなんですね.

メモ.

Ref.
http://dev.mysql.com/doc//refman/4.1/ja/insert.html