This and other RFCs are available on the web at
http://dev.perl.org/rfc/
=head1 TITLE
Allow grouping of -X file tests and add C<filetest> builtin
=head1 VERSION
Maintainer: Nathan Wiger <[EMAIL PROTECTED]>
Date: 25 Sep 2000
Mailing List: [EMAIL PROTECTED]
Number:
320
Status: Developing
=head1 ABSTRACT
Currently, file tests cannot be grouped, resulting in very long
expressions when one wants to check to make sure some thing is a
readable, writeable, executable directory:
if ( -d $file && -r $file && -w $file && -x $file ) { ... }
It would be really nice if these could be grouped instead:
if ( -drwx $file ) { ... }
Notice how much easier this is to read and write.
=head1 DESCRIPTION
=head2 File Test Grouping
See above. Multiple file tests, when grouped, should be ANDed together.
This RFC does not propose a way to OR them, since usage like this:
if ( -d $file || -r $file || -w $file || -x $file ) { ... }
Is highly uncommon, to say the least.
Notice this has the nice side effect of eliminating the need for C<_> in
many cases, since this:
if ( -d $file && -r _ && -w _ && -x _ ) { ... }
Can simply be written as a single grouped file test, as shown above. If
you need to check for more complex logic, you still have to do that
separately:
if ( -drwx $file and ! -h $file ) { ... }
This is the simplest and also probably the clearest way to implement
this.
=head2 New C<filetest> Builtin
This RFC also proposes a new C<filetest> builtin that is actually what
is used for these tests. The C<-[a-zA-Z]+> form is simply a shortcut to
this builtin, just like <> is a shortcut to C<readline>. So:
if ( -rwdx $file ) { ... }
Is really just a shortcut to the C<filetest> builtin:
if ( filetest $file, 'rwdx' ) { ... }
Either form could be used, depending on the user's preferences (just
like C<readline>).
=head1 IMPLEMENTATION
This would involve making C<-[a-zA-Z]+> a special token in all contexts,
serving as a shortcut for the C<filetest> builtin.
=head1 MIGRATION
There is a subtle trap if you are negating subroutines:
$result = -drwx $file;
And expect this to be parsed like this:
$result = - &drwx($file);
However, usage such as this is exceedingly unlikely, and can simply be
resolved by the p52p6 translator looking for C<-([a-zA-Z]{2,})> and
replacing it with C<- $1>, since injecting a single space will break up
the token.
=head1 REFERENCES
This grew out of a discussion on RFC 290 between myself, John Allen,
Clayton Scott, Bart Lateur, and others