Instead of 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 mkdir('foo')
The easiest way to read a file in Perl 6 is using slurp
. 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
Easy peasy.
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.
- Creating a new file
-
open('new', :w).close
- "Anonymous" filehandle
-
given open('foo', :w) {
.say('Hello, world!');
.close
}