Actions Status MetaCPAN Release

NAME

Aion::Fs - утилиты для файловой системы: чтение, запись, поиск, замена файлов и т.д.

VERSION

0.0.7

SYNOPSIS

use Aion::Fs;

lay mkpath "hello/world.txt", "hi!";
lay mkpath "hello/moon.txt", "noreplace";
lay mkpath "hello/big/world.txt", "hellow!";
lay mkpath "hello/small/world.txt", "noenter";

mtime "hello"  # ~> ^\d+(\.\d+)?$

[map cat, grep -f, find ["hello/big", "hello/small"]]  # --> [qw/ hellow! noenter /]

my @noreplaced = replace { s/h/$a $b H/ }
    find "hello", "-f", "*.txt", qr/\.txt$/, sub { /\.txt$/ },
        noenter "*small*",
            errorenter { warn "find $_: $!" };

\@noreplaced # --> ["hello/moon.txt"]

cat "hello/world.txt"       # => hello/world.txt :utf8 Hi!
cat "hello/moon.txt"        # => noreplace
cat "hello/big/world.txt"   # => hello/big/world.txt :utf8 Hellow!
cat "hello/small/world.txt" # => noenter

[find "hello", "*.txt"]  # --> [qw!  hello/moon.txt  hello/world.txt  hello/big/world.txt  hello/small/world.txt  !]
[find "hello", "-d"]  # --> [qw!  hello  hello/big hello/small  !]

erase reverse find "hello";

-e "hello"  # -> undef

DESCRIPTION

Этот модуль облегчает использование файловой системы.

Модули File::Path, File::Slurper и File::Find обременены различными возможностями, которые используются редко, но требуют времени на ознакомление и тем самым повышают порог входа.

В Aion::Fs же использован принцип программирования KISS - чем проще, тем лучше!

Супермодуль IO::All не является конкурентом Aion::Fs, т.к. использует ООП подход, а Aion::Fs – ФП.

SUBROUTINES/METHODS

cat ($file)

Считывает файл. Если параметр не указан, использует $_.

cat "/etc/passwd"  # ~> root

cat читает со слоем :utf8. Но можно указать другой слой следующим образом:

lay "unicode.txt", "↯";
length cat "unicode.txt"            # -> 1
length cat["unicode.txt", ":raw"]   # -> 3

cat вызывает исключение в случае ошибки операции ввода-вывода:

eval { cat "A" }; $@  # ~> cat A: No such file or directory

См. также:

lay ($file?, $content)

Записывает $content в $file.

lay "unicode.txt", "↯"  # => unicode.txt
lay ["unicode.txt", ":raw"], "↯"  # => unicode.txt

eval { lay "/", "↯" }; $@ # ~> lay /: Is a directory

См. также:

find (;$path, @filters)

Рекурсивно обходит и возвращает пути из указанного пути или путей, если $path является ссылкой на массив. Без параметров использует $_ как $path.

Фильтры могут быть:

Пути, не прошедшие проверку @filters, не возвращаются.

Если фильтр -X не является файловой функцией perl, то выбрасывается исключение:

eval { find "example", "-h" }; $@   # ~> Undefined subroutine &Aion::Fs::h called

В этом примере find не может войти в подкаталог и передаёт ошибку в функцию errorenter (см. ниже) с установленными переменными $_ и $! (путём к каталогу и сообщением ОС об ошибке).

Внимание! Если errorenter не указана, то все ошибки игнорируются!

mkpath ["example/", 0];

[find "example"]                  # --> ["example"]
[find "example", noenter "-d"]    # --> ["example"]

eval { find "example", errorenter { die "find $_: $!" } }; $@   # ~> find example: Permission denied

mkpath for qw!ex/1/11 ex/1/12 ex/2/21 ex/2/22!;

my $count = 0;
find "ex", sub { find_stop if ++$count == 3; 1}  # -> 2

См. также:

noenter (@filters)

Говорит find не входить в каталоги соответствующие фильтрам за ним.

errorenter (&block)

Вызывает &block для каждой ошибки возникающей при невозможности войти в какой-либо каталог.

find_stop ()

Останавливает find будучи вызван в одном из его фильтров, errorenter или noenter.

my $count = 0;
find "ex", sub { find_stop if ++$count == 3; 1}  # -> 2

erase (@paths)

Удаляет файлы и пустые каталоги. Возвращает @paths. При ошибке ввода-вывода выбрасывает исключение.

eval { erase "/" }; $@  # ~> erase dir /: Device or resource busy
eval { erase "/dev/null" }; $@  # ~> erase file /dev/null: Permission denied

См. также:

replace (&sub, @files)

Заменяет каждый файл на $_, если его изменяет &sub. Возвращает файлы, в которых не было замен.

@files может содержать массивы из двух элементов. Первый рассматривается как путь, а второй — как слой. Слой по умолчанию — :utf8.

&sub вызывается для каждого файла из @files. В неё передаются:

В примере ниже файл "replace.ex" считывается слоем :utf8, а записывается слоем :raw в функции replace:

local $_ = "replace.ex";
lay "abc";
replace { $b = ":utf8"; y/a/¡/ } [$_, ":raw"];
cat  # => ¡bc

См. также:

mkpath (;$path)

Как mkdir -p, но считает последнюю часть пути (после последней косой черты) именем файла и не создаёт её каталогом. Без параметра использует $_.

local $_ = ["A", 0755];
mkpath   # => A

eval { mkpath "/A/" }; $@   # ~> mkpath /A: Permission denied

mkpath "A///./file";
-d "A"  # -> 1

См. также:

mtime (;$path)

Время модификации $path в unixtime с дробной частью (из Time::HiRes::stat). Без параметра использует $_.

Выбрасывает исключение, если файл не существует или нет прав:

local $_ = "nofile";
eval { mtime }; $@  # ~> mtime nofile: No such file or directory

mtime ["/"]   # ~> ^\d+(\.\d+)?$

См. также:

sta (;$path)

Возвращает статистику о файле. Без параметра использует $_.

Чтобы можно было использовать с другими файловыми функциями, может получать ссылку на массив из которого берёт первый элемент в качестве файлового пути.

Выбрасывает исключение, если файл не существует или нет прав:

local $_ = "nofile";
eval { sta }; $@  # ~> sta nofile: No such file or directory

sta(["/"])->{ino} # ~> ^\d+$ 
sta(".")->{atime} # ~> ^\d+(\.\d+)?$

См. также:

path (;$path)

Разбивает файловый путь на составляющие или собирает его из составляющих.

path "."       # --> {path => ".", volume => undef, dir => undef, file => ".", name => undef, ext => undef}
path ["/"]     # --> {path => "/", volume => undef, dir => "/", file => undef, name => undef, ext => undef}
local $_ = "";
path           # --> {path => "", volume => undef, dir => undef, file => undef, name => undef, ext => undef}
path "a/b/c.ext.ly"   # --> {path => "a/b/c.ext.ly", volume => undef, dir => "a/b", file => "c.ext.ly", name => "c", ext => "ext.ly"}

path +{dir  => "/", ext => "ext.ly"}    # => /.ext.ly
path +{file => "b.c", ext => "ly"}      # => b.ly
path +{path => "a/b/f.c", dir => "m"}   # => m/f.c

local $_ = +{path => "a/b/f.c", dir => undef, ext => undef};
path             # => a/b/f.c
path +{path => "a/b/f.c", volume => "/x", dir => "m/y", file => "f.y", name => "j", ext => "ext"} # => m/y/j.ext
path +{path => "a/b/f.c", volume => "/x", dir =>  "/y", file => "f.y", name => "j", ext => "ext"} # => /y/j.ext

См. также:

include (;$pkg)

Подключает $pkg (если он ещё не был подключён через use или require) и возвращает его. Без параметра использует $_.

Файл lib/A.pm:

package A;
sub new { bless {@_}, shift }
1;

Файл lib/N.pm:

package N;
sub ex { 123 }
1;
use lib "lib";
include("A")->new               # ~> A=HASH\(0x\w+\)
[map include, qw/A N/]          # --> [qw/A N/]
{ local $_="N"; include->ex }   # -> 123

catonce (;$file)

Считывает файл в первый раз. Любая последующая попытка считать этот файл возвращает undef. Используется для вставки модулей js и css в результирующий файл. Без параметра использует $_.

local $_ = "catonce.txt";
lay "result";
catonce  # -> "result"
catonce  # -> undef

eval { catonce[] }; $@ # ~> catonce not use ref path!

wildcard (;$wildcard)

Переводит файловую маску в регулярное выражение. Без параметра использует $_.

wildcard "*.{pm,pl}"  # \> (?^usn:^.*?\.(pm|pl)$)
wildcard "?_??_**"  # \> (?^usn:^._[^/]_[^/]*?$)

Используется в фильтрах функции find.

См. также:

goto_editor ($path, $line)

Открывает файл в редакторе из .config на указанной строке. По умолчанию использует vscodium %p:%l.

Файл .config.pm:

package config;

config_module 'Aion::Fs' => {
    EDITOR => 'echo %p:%l > ed.txt',
};

1;
goto_editor "mypath", 10;
cat "ed.txt"  # => mypath:10\n

eval { goto_editor "`", 1 }; $@  # ~> `:1 --> 512

from_pkg (;$pkg)

Переводит пакет в путь ФС. Без параметра использует $_.

from_pkg "Aion::Fs"  # => Aion/Fs.pm
[map from_pkg, "Aion::Fs", "A::B::C"]  # --> ["Aion/Fs.pm", "A/B/C.pm"]

to_pkg (;$path)

Переводит путь из ФС в пакет. Без параметра использует $_.

to_pkg "Aion/Fs.pm"  # => Aion::Fs
[map to_pkg, "Aion/Fs.md", "A/B/C.md"]  # --> ["Aion::Fs", "A::B::C"]

AUTHOR

Yaroslav O. Kosmina dart@cpan.org

LICENSE

GPLv3

COPYRIGHT

The Aion::Fs is copyright © 2023 by Yaroslav O. Kosmina. Rusland. All rights reserved.