I ♥ WordPress

[時間割:Perl]『ミニマルPerl』その18
2009/02/10 01:24 posted by kunkichi

何事もなかったかのように進めます(笑)月曜日は「Perl」の時間。引き続き、組み込み関数をいろいろ見ていきます。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 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
    -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。$ 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.txt
    -rw-r--r--  1 kunkichi  staff  48  1  9 00:07 sample.txt
    Perlで書く場合は、Stat::lsModeを使って、パーミッションの表示をlsコマンドと同じにしてみる。#!/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.txt
    -rw-r--r-- 1 kunkichi kunkichi 0 Mon Feb  9 23:27:26 2009 sample.txt
    getpwuid、getgrgidは組み込み関数で、UID、GID
    からユーザ名、グループ名に変換する。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





このページの先頭へ