develooper Front page | perl.perl6.users | Postings from May 2021

File::Find using a junction with exclude

Thread Previous | Thread Next
Joseph Brenner
May 20, 2021 23:52
File::Find using a junction with exclude
Message ID:
The documentation for File::Find says that the exclude argument
is applied via a smart-match, so I thought that I could use a
junction, like so:

   use File::Find
   my @files = find( dir => $loc, type => 'file', exclude => any(
@exclude_pats ) );

But instead of getting an array of file names (either strings or
IO objects would be fine), that returns an any junction of IO
objects, built-up from a peculiar set of hits.

Does that make sense to anyone?

Here's some code that demos the problem:

use v6;
use File::Find;

## create some files to find
my $loc = "/tmp/monster_island";
mkdir( $loc );
chdir( $loc );
my @monsters = < godzilla mothera rhodan >;
for @monsters -> $name {
    $name.IO.spurt("The $name attacks!");

## without exclude, we find all 3 files
my @files_all = find( dir => $loc, type => 'file' );
say @files_all.elems;     # 3

## with a handcrafted regex we find only 2, skipping mothera as expected
my @files_trimmed = find( dir => $loc, type => 'file', exclude =>
rx/<|w>[mothera|camel]$/ );
say @files_trimmed.elems; # 2

## Trying to do the same with an any junction doesn't work:
my @exclude = ( rx/<|w>mothera$/, rx/<|w>camel$/ );
my @files = find( dir => $loc, type => 'file', exclude => any(@exclude) );
say @files;
# [any(("/home/doom/tmp/monster_island/godzilla".IO
## (1) we end up with a single "any" junction in the first element
## (2) there are five hits, two redundant rhodan and godzillas, plus
one mothera slips through (?)

## but note that this works:
for @monsters {
    .say unless $_ ~~ any(@exclude)
# godzilla
# rhodan

raku --version
Welcome to 𝐑𝐚𝐤𝐮𝐝𝐨™ v2020.10.
Implementing the 𝐑𝐚𝐤𝐮™ programming language v6.d.
Built on MoarVM version 2020.10.

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About