[時間割:Perl]『ミニマルPerl』その18
2009/02/10 01:24 posted by kunkichi
何事もなかったかのように進めます(笑)月曜日は「Perl」の時間。引き続き、組み込み関数をいろいろ見ていきます。
ミニマルPerl Unix/LinuxユーザのためのPerl習得法
posted with amazlet at 08.10.06
Tim Maher
オライリージャパン
売り上げランキング: 96883
オライリージャパン
売り上げランキング: 96883
- statを使っていろいろファイルの情報を取ってみる。
- 一般的な使い方
my @stats = stat "sample.txt";
0 ファイルシステムのデバイス番号 1 i ノード番号 2 ファイルの権限 3 ファイルへのハードリンク数 4 ファイル所有者のユーザID 5 ファイル所有者のグループID 6 デバイス識別子 7 ファイルのサイズ(バイト) 8 最終アクセス時刻 9 最終変更時刻 10 最終 i ノード変更時刻 11 標準ブロックサイズ 12 ファイルに割り当てられているブロック数 - 括弧で括ってそれに対して添字でアクセスすることもできる。
print (stat "sample.txt")[7];
- 一般的な使い方
- シェルの”-nt”をPerlで書く。っていうか”-nt”って知らなんだ、ファイルのmtimeを比較する演算子(newer thanの略)。これは便利だね。
まずはシェルの場合。ls -lt sample*txt次にPerl。
-rw-r--r-- 1 kunkichi staff 48 1 9 00:07 sample.txt
-rw-r--r-- 1 kunkichi staff 62 9 16 23:04 sample2.txt
$ [[ "sample.txt" -nt "sample2.txt" ]] && echo "sample.txt"
sample.txt$ perl -e '(stat "sample.txt")[9] > (stat "sample2.txt")[9] and print "sample.txt\n";'
sample.txt - ただし、statは実行ユーザの権限に従うので、ファイルの権限がない場合等を考慮して、ファイル単位で処理するほうがよい。$! で OSエラーメッセージを取ってみる。
$ perl -e '$mtime1 = (stat "sample3.txt")[9] or die "cannot stat \"sample.txt\": $!";'
cannot stat "sample.txt": No such file or directory at -e line 1. - lsをPerlで書いてみる。僕のMacだとこんな感じに表示される。
$ ls -lt sample.txtPerlで書く場合は、Stat::lsModeを使って、パーミッションの表示をlsコマンドと同じにしてみる。
-rw-r--r-- 1 kunkichi staff 48 1 9 00:07 sample.txt#!/usr/bin/perl -w実行結果は以下。
use strict;
use Stat::lsMode;
my $filename = $ARGV[0];
my @stats = stat $filename;
my $mode = format_mode $stats[2];
my $nlink = $stats[3];
my $uid = getpwuid $stats[4];
my $gid = getgrgid $stats[5];
my $size = $stats[7];
my $mtime = localtime $stats[9];
printf"%s %d %s %s %d %s %s\n", $mode, $nlink, $uid, $gid, $size, $mtime, $filename;$ ./ls.pl sample.txtgetpwuid、getgrgidは組み込み関数で、UID、GID
-rw-r--r-- 1 kunkichi kunkichi 0 Mon Feb 9 23:27:26 2009 sample.txt
からユーザ名、グループ名に変換する。format_mode でls風の出力に変換。 - シェルでファイル演算子を使う場合、ファイル演算子は引数にファイル名を取るので、条件節で同じファイルにいろんな条件チェックをする場合は以下となる。
[[ -f "sample.txt" && -r "sample.txt" && -s "sample.txt" ]]これでは面倒なので、Perlではstatやファイル演算子で使用された、「最後」のファイル名を”_”(アンダースコア)で参照できる。ただし同じブロック内のみ。-f "sample.txt" and -r _ and -s _statの場合はこんな感じ。(stat "sample.txt")[9] == (stat _)[10] - statを使うときは perldoc -f statを実行して、コピペして楽しよう。
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
今日はここまで〜。






コメント&トラックバック
トラックバックURL: