opendir and friends, in Perl 6 there is a single
dir subroutine, returning a list of the files in a specified directory, defaulting to the current directory. A piece of code speaks a thousand words (some result lines are line-wrapped for better readability):
# in the Rakudo source directory > dir build parrot_install Makefile VERSION parrot docs Configure.pl README dynext t src tools CREDITS LICENSE Test.pm > dir 't' 00-parrot 02-embed spec harness 01-sanity pmc spectest.data
dir has also an optional named parameter
test, used to grep the results
> dir 'src/core', test => any(/^C/, /^P/) Parcel.pm Cool.pm Parameter.pm Code.pm Complex.pm CallFrame.pm Positional.pm Capture.pm Pair.pm Cool-num.pm Callable.pm Cool-str.pm
Directories are created with
mkdir, as in
The easiest way to read a file in Perl 6 is using
slurp returns the contents of a file, as a String,
> slurp 'VERSION' 2010.11
The good, old way of using filehandles is of course still available
> my $fh = open 'CREDITS' IO()<0x1105a068> > $fh.getc # reads a single character = > $fh.get # reads a single line pod > $fh.close; $fh = open 'new', :w # open for writing IO()<0x10f3e704> > $fh.print('foo') Bool::True > $fh.say('bar') Bool::True > $fh.close; say slurp('new') foobar
Testing the existence and types of files is done with smartmatching (~~). Again, the code:
> 'LICENSE'.IO ~~ :e # does the file exist? Bool::True > 'LICENSE'.IO ~~ :d # is it a directory? Bool::False > 'LICENSE'.IO ~~ :f # a file then? Bool::True
When the standard features are not enough, modules come in handy. File::Find (available in the
File::Tools package) traverses the directory tree looking for the files you need, and generates a lazy lists of the found ones. File::Find comes shipped with Rakudo Star, and can be easily installed with neutro if you have just a bare Rakudo.
Example usage? Sure.
find(:dir<t/dir1>, :type<file>, :name(/foo/)) will generate a lazy list of files (and files only) in a directory named t/dir1 and with a name matching the regex
/foo/. Notice how the elements of a list are not just plain strings: they’re objects which strinigify to the full path, but also provide accessors for the directory they’re in (
dir) and the filename itself (
name). For more info please refer to the documentation.