Answers to Chapter 12 Exercises
Here’s one way to do it:
foreach my $file (@ARGV) { my $attribs = &attributes($file); print "'$file' $attribs.\n"; } sub attributes { # report the attributes of a given file my $file = shift @_; return "does not exist" unless -e $file; my @attrib; push @attrib, "readable" if -r $file; push @attrib, "writable" if -w $file; push @attrib, "executable" if -x $file; return "exists" unless @attrib; 'is ' . join " and ", @attrib; # return value }
In this one, once again it’s convenient to use a subroutine. The main loop prints one line of attributes for each file, perhaps telling us that
'cereal-killer'
is executable or that'sasquatch'
does not exist.The subroutine tells us the attributes of the given filename. Of course, if the file doesn’t even exist, there’s no need for the other tests, so we test for that first. If there’s no file, we’ll return early.
If the file does exist, we’ll build a list of attributes. (Give yourself extra credit points if you used the special
_
filehandle instead of$file
on these tests, to keep from calling the system separately for each new attribute.) It would be easy to add additional tests like the three we show here. But what happens if none of the attributes is true? Well, if we can’t say anything else, at least we can say that the file exists, so we do. Theunless
clause uses the fact that@attrib
will be true (in a Boolean context, which is a special case of a scalar context) if it’s got any elements.But if we’ve got some ...
Get Learning Perl, 5th Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.