$retMode & 0777
は、リターンモード(ファイルのアクセス権+ファイルタイプ)と、8進表現の数値が777のBitwise-And(たとえば、10進数511、たとえば2進数111111111)の値を取ることを意味します。
これは技術的に9ビット目の上の整数から任意のビットを削除するので、モードのバイナリ表現が> 9ビットであった場合、この操作の後、主なアクセス権を表す最後の9ビットだけを残します他の/グループ/ユーザのための読み書き/実行)。
なぜ?そのため(としてperldoc statショーは)、mode()
がstat
から返さ:
% 0 『であれば" は、ファイルの種類の部分と、使用して(複数可)のprintfをマスクする必要があり、ファイルの種類とその権限の両方が含まれています』あなたは本当の許可を見たいと思っています。
つまり、9ビット目以上のデータが含まれていますが、最後の9ビットだけが上記のコードの後のパーミッションデータを表します。より正確に言えば、最後の12桁は許可を表します(したがってコードは& 07777
を実行する必要があります)が、ビット10-12はユーザー/グループ/その他の読み取り/書き込み/実行パーマ(setuid、is_directoryなど)と無関係な特別な許可ビットを表します。
$retMode & 006
は、同様のメカニズムを持っていますが、目的が異なります。 006オクタルはバイナリで110なので、基本的にモードビットベクトルをとり、2/3の位置にビットだけを残します。ブール値のコンテキストで結果が使用されるため、結果の#が0でないかどうかを確認するだけです。つまり、これらの2ビットのうちの1つが1に設定されているかどうかを確認します。& 006
は実際にはBADどのビットがどのパーマであるかは明白ではない(私はに微妙にをヒントしているが、上の段落でどのビット2/3が意味しているか説明しない)。代わりに、Fcntlモジュールでシンボリックモード定数(S_IF *)と関数(S_IS *)をインポートする必要があります
use Fcntl ':mode';
$retMode = $retMode & 0777; # Ignoring setuid and directory bits
$other_read_or_write = $retMode & (S_IWOTH || S_IROTH);
# Bits 2/3 - Other read/write
if ($other_read_or_write) {
printf "$property|%03o|$fpath\n",$retMode;
}
出典
2011-01-13 20:41:13
DVK
なぜコードは "other"の読み取りまたは書き込みをチェックしますか? – DVK
あなたは '&'演算子が何を意味するかを見るために[ドキュメンテーション](http://perldoc.perl.org/perlop.html#Bitwise-And)を調べてみましたか? – Ether
@Ether - 私のコメントやOPへの返答でしたか? – DVK