Perl6: 列舉出某目錄底下所有檔案


拜訪指定目錄、深入其底下所有子目錄、舉列出其中所有檔案。我在學習新的程式語言時,常常以這個題目來當成基本練習。

我也自做了一個自認實用的程式: fl。程式全文如下:

#!/usr/bin/env perl6
use v6;

my %IGNORE = (
    "node_modules" => 1,
    ".git" => 1,
);

sub find-files($dir) {
    my @stash = $dir;
    dir($dir).flatmap(-> $p {
        if $p.f {
            $p.path
        } elsif $p.d && ! %IGNORE{$p.basename} {
            find-files($p.path)
        }
    });
}

my $start_dir = @*ARGS[0] // ".";

.say for find-files($start_dir);

用例如下:

fl
fl ~/src

如果不給參數,就以目前所在目錄做為參數。基本上這指令等價於:

find . -type f | grep -vE '(\.git|node_modules)/'

由於 .gitnode_modules 底下通常不會有甚麼有用的資訊,所以預設為忽略。

RosettaCode/Walk a directory/Recursively #Perl6 上以 gather/take 語法寫成的版本比較,我所做的這版似乎稍微快一些些。以走完我的 ~/src 來測試的話,兩版都正確地印出了 211770 列文字,測試第一輪時,RosettaCode 上的版本費 30 秒、我的版本費 25 秒。第二輪的結果分別為 32 秒與 26 秒。

若要更快,或許可以改為非遞迴版、並輔以 hyper/race 關鍵字,讓其使用多 CPU。