指定したファイルがどういう権限をもっているかを、
Perlで知る方法です。
パーミッションを変更するのは chmodでできますし、
パーミッションをみるなら`ls -l`とかすれば見えることはみえるんですが、
もっと単刀直入にできないかなと。
Perlの組み込み関数「 stat 」を使えばひとまずその情報は取得出来ます。
my @stats = stat $file; # 0 dev ファイルシステムのデバイス番号 # 1 ino iノード番号 # 2 mode ファイルモード # 3 nlink このファイルへのハードリンク数 # 4 uid ファイルの所有者のユーザID( 数字 ) # 5 gid ファイルの所有者のグループID( 数字 ) # 6 rdev デバイス識別子 # 7 size ファイルのサイズ( バイト ) # 8 atime 最終アクセスしてからの経過したエポック時からの秒数 # 9 mtime 最終更新してからの経過したエポック時からの秒数 # 10 ctime iノードが変更されてから経過したエポック時からの秒数 # 11 blksize ファイルの読み書きに適切だと考えられるブロックサイズ # 12 blocks 割り当てられている実際のブロック数
参考:ファイルの詳細な情報を取得する - stat関数 - サンプルコードによるPerl入門
これだとパーミッションの情報以外にもいろいろな情報が取得されて、3番目がパーミッションの情報であるファイル・モードです。(配列添字だと2)
他の情報はいらないので、ファイル・モードの情報だけ取り出すときは、
例えば下記のようにします。
my $mode = [ stat $file ]->[2];
Perl初心者にはこの表現は難しいとおもいますが、
stat $file とやると配列が返ってくるので、そいつをいきなり [ ] で受けとって、
無名配列化し、その3番目の要素(添字は2)にアクセスするという感じです。
やってることは下記と同じです。
my @stats = stat $file; my $mode = $stats[2]
あるいは
my @stats = stat $file; my $mode = [ @stats ]->[2]
または、無名配列化しないで受け取ってもいいです。
my $mode = ( stat $file )[2];
そうやって取得したモードはそのまま表示しても見慣れたパーミッション情報には
ならないので、マスクをかけてわかるようにします。
printf "Permissions are %04o\n", $mode & 07777;
参考:perlfunc - search.cpan.org #stat
( Perlの演算子「 & 」 はビットごとのAND ref)
あるいは、モジュール「 Fcntl ':mode'; 」を使うことで、
もう少し簡単になります。
Fcntl モジュールは標準モジュールなので、わざわざインストールする必要がありません。
use Fcntl ':mode'; ...略... printf ("%o\n", S_IMODE($mode); #644というように8進表示 printf ("%b\n", S_IMODE($mode); #101100101という風に2進表示
参考:ファイルパーミッションを調べる - サンプルコードによるPerl入門
わざわざマスクをかけなくても、8進数表示したものの下三桁を取得するのでも
よいみたいです?(マスク不要なの?)
my $mode = ( stat $file )[2]; $p = substr( (sprintf "%03o", $mode), -3); #644というように8進表示
File::chmodというモジュールがありますが、
こちらは標準ではないのでインストールが必要になります。
このモジュールの getmod というメソッドを使えば、
もっと端的にパーミッションを取得できそうです。
File::chmod - Implements symbolic and ls chmod modes - metacpan.org
>tokuhiromさん
ものすごく遅くなってしまいましたが、コメントありがとうございます。
File::statモジュールは当時の僕には使い方がわからず、少し調べてからお返事しようと思っていたらずるずると遅くなってしまいました。
ともかくありがとうございます。
http://search.cpan.org/~rjbs/perl-5.18.2/lib/File/stat.pm
標準モジュールである File::stat をつかうことで、すこしわかりやすくかくことができます。