Perl has a number of operators for testing the conditions of files. These operators are useful if you want to know if a file is readable, or executable, or if it's a directory, and so on. Because Perl was designed and written on Unix, you will find that many of these operators do not work as expected on Windows NT or other non-Unix operating systems. If you are using a non-Unix system and are unsure whether a particular operator does what you expect, you can try it from the command line with something like this:
perl -e "print -X 'filename' ? qq(true\n)
: qq(false\n)"
The example above would normally appear on a single line. It is broken into multiple lines for readability.
Operator | Used for |
-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. |
-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). |
-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 a text file. |
-B | File is a binary file (opposite of -T). |
-M | Age of file in days when script started. |
-A | Same for access time. |
-C | Same for inode change time. |
Use the operator you are testing and a suitable filename, in place of
-X
and
filename
above.
Then you can see if you get the result you expect.
- Common uses for file test Operators in Perl
To see if a file exists, you can check it with -e
, like this:
if(-e $filename) {
print "$filename is there!\n"
}
else {
print "I didn't find $filename!\n"
}
Is the file a directory? Check it like this:
if(-d $filename) {
print "$filename is a directory\n"
}
else {
print "$filename is not a directory\n"
}
You can use the special filehandle _
to check the same file more than once.
This code checks to see if a file is a plain file, then reports its size:
if(-f $filename) {
$size = -s _;
print "$filename is $size bytes."
}
else {
print "didn't find $filename\n"
}
As mentioned, the difference between Perlâs functions and operators is a bit vague at times, but for
convenience, the punctuation bits are referred to as operators.
- Repetition Operator: x
STRING x INTEGER
(STRING) x INTEGER
The x operator is for repetition. Itâs often used to repeat a string several times:
my $santa_says = 'ho' x 3.7;
print $santa_says;
The previous code assigns hohoho to $santa_says.
Sometimes you will want to assign a single value multiple times to a list. Just put the string in parentheses to force list context:
my $ho = 'ho';
my @santa_says = ($ho) x 3;
@santa_says now contains the three strings ho, ho, and ho.