use strict; my $file = shift or die 'gimme a file!'; die 'no such file' unless -e $file; while () { my ($test,$msg) = split(/\s+/,$_,2); my $sub = eval "sub { $test shift }"; print $msg if $sub->($file); } __DATA__ -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. -z File has zero size. -s File has nonzero size (returns size). -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. -B File is a "binary" file (opposite of -T).