The perlfunc documentation covers the long list of Perl's file-test operators that covers many situations you will encounter in practice.
Abstract:
-e: File exists.
-f: File is a plain file.
-d: File is a directory.
-z: File has zero size (is empty).
-s: File has nonzero size (returns size in bytes).
Details:
-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.-e
File exists.-z
File has zero size (is empty).-s
File has nonzero size (returns size in bytes).-f
File is a plain file.-d
File is a directory.-l
File is a symbolic link (false if symlinks aren’t supported by the file system).-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 or UTF-8 text file (heuristic guess).-B
File is a “binary” file (opposite of-T
).-M
Script start time minus file modification time, in days.-A
Same for access time.-C
Same for inode change time (Unix, may differ for other platforms)