On 2017-09-29 09:53, Parrot Raiser wrote:
-e is fairly easy. It asks if something exists. Ignoring Schrodinger,
either it does (i.e True) or it doesn't. (False)
-f is more ambiguous. It asks if something has a property (fileness)
or not. If it exists, it either does or doesn't. [...]
Bash appears to err on the pragmatic side, returning "fail" for both
-e and -f on a non-existent file.
But that's not what Bash (and the original implementation, /bin/test)
do. From "man test":
-e FILE
FILE exists
-f FILE
FILE exists and is a regular file
The problem is that Perl 6 is currently asking "is something a regular
file?" which leads to this debate about what should happen if the thing
doesn't exist. I think it would be easier and clearer if Perl 6 instead
adopted the standard meaning /bin/test, Bash, Python, and other
languages use. This is arguably the most common thing to test for, and
it is also what most programmers will expect (principal of least
surprise). I the less common case where someone wants to do different
things depending on whether something does not exist or is/isn't a
regular file, then instead of calling $file.f and differentiating
between two non-True values, I think the code would be clearer if they
tested $file.e first and then $file.f -- this should be nearly equal in
efficiency since the file metadata (the results of the stat() system
call on POSIX-like operating systems) should be cached.
In other words, I think we should change the Perl 6 spec to define .f as
"exists and is a file".
--
Mark Montague
m...@catseye.org