Aion-Fs
view release on metacpan or search on metacpan
t/aion/fs.t view on Meta::CPAN
use common::sense; use open qw/:std :utf8/; use Carp qw//; use Cwd qw//; use File::Basename qw//; use File::Find qw//; use File::Slurper qw//; use File::Spec qw//; use File::Path qw//; use Scalar::Util qw//; use Test::More 0.98; use String::Diff q...
# # NAME
#
# Aion::Fs - ÑÑилиÑÑ Ð´Ð»Ñ Ñайловой ÑиÑÑемÑ: ÑÑение, запиÑÑ, поиÑк, замена Ñайлов и Ñ.д.
#
# # VERSION
#
# 0.2.2
#
# # SYNOPSIS
#
subtest 'SYNOPSIS' => sub {
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";
::like scalar do {mtime "hello";}, qr{^\d+(\.\d+)?$}, 'mtime "hello"; # ~> ^\d+(\.\d+)?$'; undef $::_g0; undef $::_e0;
local ($::_g0 = do {[map cat, grep -f, find ["hello/big", "hello/small"]];}, $::_e0 = do {[qw/ hellow! noenter /]}); ::is_deeply $::_g0, $::_e0, '[map cat, grep -f, find ["hello/big", "hello/small"]]; # --> [qw/ hellow! noenter /]' or ::diag ::_stru...
my @noreplaced = replace { s/h/$a $b H/ }
find "hello", "-f", "*.txt", qr/\.txt$/, sub { /\.txt$/ },
noenter "*small*",
errorenter { warn "find $_: $!" };
local ($::_g0 = do {\@noreplaced;}, $::_e0 = do {["hello/moon.txt"]}); ::is_deeply $::_g0, $::_e0, '\@noreplaced; # --> ["hello/moon.txt"]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {cat "hello/world.txt";}, $::_e0 = "hello/world.txt :utf8 Hi!"); ::ok $::_g0 eq $::_e0, 'cat "hello/world.txt"; # => hello/world.txt :utf8 Hi!' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {cat "hello/moon.txt";}, $::_e0 = "noreplace"); ::ok $::_g0 eq $::_e0, 'cat "hello/moon.txt"; # => noreplace' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {cat "hello/big/world.txt";}, $::_e0 = "hello/big/world.txt :utf8 Hellow!"); ::ok $::_g0 eq $::_e0, 'cat "hello/big/world.txt"; # => hello/big/world.txt :utf8 Hellow!' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef...
local ($::_g0 = do {cat "hello/small/world.txt";}, $::_e0 = "noenter"); ::ok $::_g0 eq $::_e0, 'cat "hello/small/world.txt"; # => noenter' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {[find "hello", "*.txt"];}, $::_e0 = do {[qw! hello/moon.txt hello/world.txt hello/big/world.txt hello/small/world.txt !]}); ::is_deeply $::_g0, $::_e0, '[find "hello", "*.txt"]; # --> [qw! hello/moon.txt hello/world.txt he...
my @dirs;
my $iter = find "hello", "-d";
while(<$iter>) {
push @dirs, $_;
}
local ($::_g0 = do {\@dirs;}, $::_e0 = do {[qw! hello hello/big hello/small !]}); ::is_deeply $::_g0, $::_e0, '\@dirs; # --> [qw! hello hello/big hello/small !]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
erase reverse find "hello";
local ($::_g0 = do {-e "hello";}, $::_e0 = do {undef}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '-e "hello"; # -> undef' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# # DESCRIPTION
#
# ÐÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¾Ð±Ð»ÐµÐ³ÑÐ°ÐµÑ Ð¸ÑполÑзование Ñайловой ÑиÑÑемÑ.
#
# ÐодÑли `File::Path`, `File::Slurper` и
# `File::Find` обÑÐµÐ¼ÐµÐ½ÐµÐ½Ñ ÑазлиÑнÑми возможноÑÑÑми, коÑоÑÑе иÑполÑзÑÑÑÑÑ Ñедко, но ÑÑебÑÑÑ Ð²Ñемени на ознакомление и Ñем ÑамÑм повÑÑаÑÑ Ð¿Ð¾Ñог...
#
# Ð `Aion::Fs` же иÑполÑзован пÑинÑип пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ KISS - Ñем пÑоÑе, Ñем лÑÑÑе!
#
# СÑпеÑмодÑÐ»Ñ `IO::All` не ÑвлÑеÑÑÑ ÐºÐ¾Ð½ÐºÑÑенÑом `Aion::Fs`, Ñ.к. иÑполÑзÑÐµÑ ÐÐРподÑ
од, а `Aion::Fs` â ФÐ.
#
# * ÐÐÐ â обÑекÑно-оÑиенÑиÑованное пÑогÑаммиÑование.
# * ФРâ ÑÑнкÑионалÑное пÑогÑаммиÑование.
#
# # SUBROUTINES/METHODS
#
# ## cat ($file)
#
# СÑиÑÑÐ²Ð°ÐµÑ Ñайл. ÐÑли паÑамеÑÑ Ð½Ðµ Ñказан, иÑполÑзÑÐµÑ `$_`.
#
::done_testing; }; subtest 'cat ($file)' => sub {
::like scalar do {cat "/etc/passwd"}, qr{root}, 'cat "/etc/passwd" # ~> root'; undef $::_g0; undef $::_e0;
#
# `cat` ÑиÑÐ°ÐµÑ Ñо Ñлоем `:utf8`. Ðо можно ÑказаÑÑ Ð´ÑÑгой Ñлой ÑледÑÑÑим обÑазом:
#
lay "unicode.txt", "â¯";
local ($::_g0 = do {length cat "unicode.txt"}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'length cat "unicode.txt" # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {length cat["unicode.txt", ":raw"]}, $::_e0 = do {3}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'length cat["unicode.txt", ":raw"] # -> 3' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
t/aion/fs.t view on Meta::CPAN
#
::done_testing; }; subtest 'lay ($file?, $content)' => sub {
local ($::_g0 = do {lay "unicode.txt", "â¯"}, $::_e0 = "unicode.txt"); ::ok $::_g0 eq $::_e0, 'lay "unicode.txt", "â¯" # => unicode.txt' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {lay ["unicode.txt", ":raw"], "â¯"}, $::_e0 = "unicode.txt"); ::ok $::_g0 eq $::_e0, 'lay ["unicode.txt", ":raw"], "â¯" # => unicode.txt' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
::like scalar do {eval { lay "/", "â¯" }; $@}, qr{lay /: Is a directory}, 'eval { lay "/", "â¯" }; $@ # ~> lay /: Is a directory'; undef $::_g0; undef $::_e0;
#
# ### See also
#
# * [autodie](https://metacpan.org/pod/autodie) â `open $f, ">r.txt"; print $f $contents; close $f`.
# * [File::Slurp](https://metacpan.org/pod/File::Slurp) â `write_file('file.txt', $contents)`.
# * [File::Slurper](https://metacpan.org/pod/File::Slurper) â `write_text('file.txt', $contents)`, `write_binary('file.txt', $contents)`.
# * [IO::All](https://metacpan.org/pod/IO::All) â `io('file.txt') < $contents`.
# * [IO::Util](https://metacpan.org/pod/IO::Util) â `slurp \$contents, 'file.txt'`.
# * [File::Util](https://metacpan.org/pod/File::Util) â `File::Util->new->write_file(file => 'file.txt', content => $contents, bitmask => 0644)`.
# * [Mojo::File](https://metacpan.org/pod/Mojo::File) â `path($file)->spew($chars, 'UTF-8')`.
#
# ## find (;$path, @filters)
#
# РекÑÑÑивно обÑ
Ð¾Ð´Ð¸Ñ Ð¸ возвÑаÑÐ°ÐµÑ Ð¿ÑÑи из Ñказанного пÑÑи или пÑÑей, еÑли `$path` ÑвлÑеÑÑÑ ÑÑÑлкой на маÑÑив. Ðез паÑамеÑÑов иÑполÑзÑÐµÑ `$_` кÐ...
#
# ФилÑÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ:
#
# * ÐодпÑогÑаммой â пÑÑÑ Ðº ÑекÑÑÐµÐ¼Ñ ÑÐ°Ð¹Ð»Ñ Ð¿ÐµÑедаÑÑÑÑ Ð² `$_`, а подпÑогÑамма должна веÑнÑÑÑ Ð¸ÑÑÐ¸Ð½Ñ Ð¸Ð»Ð¸ ложÑ, как они понимаÑÑÑÑ perl-ом.
# * Regexp â ÑеÑÑиÑÑÐµÑ ÐºÐ°Ð¶Ð´Ñй пÑÑÑ ÑегÑлÑÑнÑм вÑÑажением.
# * СÑÑока в виде "-Xxx", где `Xxx` â один или неÑколÑко Ñимволов. ÐналогиÑна опеÑаÑоÑам perl-а Ð´Ð»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñайлов. ÐÑимеÑ: `-fr` пÑовеÑÑÐµÑ Ð¿ÑÑÑ...
# * ÐÑÑалÑнÑе ÑÑÑоки пÑевÑаÑаÑÑÑÑ ÑÑнкÑией `wildcard` (Ñм. ниже) в ÑегÑлÑÑное вÑÑажение Ð´Ð»Ñ Ð¿ÑовеÑки каждого пÑÑи.
#
# ÐÑÑи, не пÑоÑедÑие пÑовеÑÐºÑ `@filters`, не возвÑаÑаÑÑÑÑ.
#
# ÐÑли ÑилÑÑÑ -X не ÑвлÑеÑÑÑ Ñайловой ÑÑнкÑией perl, Ñо вÑбÑаÑÑваеÑÑÑ Ð¸ÑклÑÑение:
#
::done_testing; }; subtest 'find (;$path, @filters)' => sub {
::like scalar do {eval { find "example", "-h" }; $@}, qr{Undefined subroutine &Aion::Fs::h called}, 'eval { find "example", "-h" }; $@ # ~> Undefined subroutine &Aion::Fs::h called'; undef $::_g0; undef $::_e0;
#
# Ð ÑÑом пÑимеÑе `find` не Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð¹Ñи в подкаÑалог и пеÑедаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð² ÑÑнкÑÐ¸Ñ `errorenter` (Ñм. ниже) Ñ ÑÑÑановленнÑми пеÑеменнÑми `$_` и `$!` (пÑÑÑм к...
#
# **Ðнимание!** ÐÑли `errorenter` не Ñказана, Ñо вÑе оÑибки **игноÑиÑÑÑÑÑÑ**!
#
mkpath ["example/", 0];
local ($::_g0 = do {[find "example"]}, $::_e0 = do {["example"]}); ::is_deeply $::_g0, $::_e0, '[find "example"] # --> ["example"]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {[find "example", noenter "-d"]}, $::_e0 = do {["example"]}); ::is_deeply $::_g0, $::_e0, '[find "example", noenter "-d"] # --> ["example"]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
::like scalar do {eval { find "example", errorenter { die "find $_: $!" } }; $@}, qr{find example: Permission denied}, 'eval { find "example", errorenter { die "find $_: $!" } }; $@ # ~> find example: Permission denied'; undef $::_g0; undef $::_e0;
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};
local ($::_g0 = do {$count}, $::_e0 = do {3}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '$count # -> 3' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ### See also
#
# * [AudioFile::Find](https://metacpan.org/pod/AudioFile::Find) â иÑÐµÑ Ð°ÑдиоÑÐ°Ð¹Ð»Ñ Ð² Ñказанной диÑекÑоÑии. ÐозволÑÐµÑ ÑилÑÑÑоваÑÑ Ð¸Ñ
по аÑÑибÑÑам: названиÑ, аÑÑиÑÑÑ, ж...
# * [Directory::Iterator](https://metacpan.org/pod/Directory::Iterator) â `$it = Directory::Iterator->new($dir, %opts); push @paths, $_ while <$it>`.
# * [IO::All](https://metacpan.org/pod/IO::All) â `@paths = map { "$_" } grep { -f $_ && $_->size > 10*1024 } io(".")->all(0)`.
# * [IO::All::Rule](https://metacpan.org/pod/IO::All::Rule) â `$next = IO::All::Rule->new->file->size(">10k")->iter($dir1, $dir2); push @paths, "$f" while $f = $next->()`.
# * [File::Find](https://metacpan.org/pod/File::Find) â `find( sub { push @paths, $File::Find::name if /\.png/ }, $dir )`.
# * [File::Find::utf8](https://metacpan.org/pod/File::Find::utf8) â как [File::Find](https://metacpan.org/pod/File::Find), ÑолÑко пÑÑи Ñайлов в _utf8_.
# * [File::Find::Age](https://metacpan.org/pod/File::Find::Age) â ÑоÑÑиÑÑÐµÑ ÑÐ°Ð¹Ð»Ñ Ð¿Ð¾ вÑемени модиÑикаÑии (наÑледÑÐµÑ [File::Find::Rule](https://metacpan.org/pod/File::Find::Rule)): `File::Find::Age->in($dir...
# * [File::Find::Declare](https://metacpan.org/pod/File::Find::Declare) â `@paths = File::Find::Declare->new({ size => '>10K', perms => 'wr-wr-wr-', modified => '<2010-01-30', recurse => 1, dirs => [$dir1] })->find`.
# * [File::Find::Iterator](https://metacpan.org/pod/File::Find::Iterator) â Ð¸Ð¼ÐµÐµÑ ÐÐРинÑеÑÑÐµÐ¹Ñ Ñ Ð¸ÑеÑаÑоÑом и ÑÑнкÑии `imap` и `igrep`.
# * [File::Find::Match](https://metacpan.org/pod/File::Find::Match) â вÑзÑÐ²Ð°ÐµÑ Ð¾Ð±ÑабоÑÑик на каждÑй подоÑедÑий ÑилÑÑÑ. ÐоÑ
ож на `switch`.
# * [File::Find::Node](https://metacpan.org/pod/File::Find::Node) â обÑ
Ð¾Ð´Ð¸Ñ Ð¸ÐµÑаÑÑ
Ð¸Ñ Ñайлов паÑаллелÑно неÑколÑкими пÑоÑеÑÑами: `tie @paths, IPC::Shareable, { key => "GLUE STRING", create => 1 };...
# * [File::Find::Fast](https://metacpan.org/pod/File::Find::Fast) â `@paths = @{ find($dir) }`.
# * [File::Find::Object](https://metacpan.org/pod/File::Find::Object) â Ð¸Ð¼ÐµÐµÑ ÐÐРинÑеÑÑÐµÐ¹Ñ Ñ Ð¸ÑеÑаÑоÑом.
# * [File::Find::Parallel](https://metacpan.org/pod/File::Find::Parallel) â ÑÐ¼ÐµÐµÑ ÑÑавниваÑÑ Ð´Ð²Ð° каÑалога и возвÑаÑаÑÑ Ð¸Ñ
обÑединение, пеÑеÑеÑение и колиÑеÑÑвенное пеÑе...
# * [File::Find::Random](https://metacpan.org/pod/File::Find::Random) â вÑбиÑÐ°ÐµÑ Ñайл или диÑекÑоÑÐ¸Ñ Ð½Ð°Ñгад из иеÑаÑÑ
ии Ñайлов.
# * [File::Find::Rex](https://metacpan.org/pod/File::Find::Rex) â `@paths = File::Find::Rex->new(recursive => 1, ignore_hidden => 1)->query($dir, qr/^b/i)`.
# * [File::Find::Rule](https://metacpan.org/pod/File::Find::Rule) â `@files = File::Find::Rule->any( File::Find::Rule->file->name('*.mp3', '*.ogg')->size('>2M'), File::Find::Rule->empty )->in($dir1, $dir2);`. ÐÐ¼ÐµÐµÑ Ð¸ÑеÑаÑоÑ, пÑоÑе...
# * [File::Find::Wanted](https://metacpan.org/pod/File::Find::Wanted) â `@paths = find_wanted( sub { -f && /\.png/ }, $dir )`.
# * [File::Hotfolder](https://metacpan.org/pod/File::Hotfolder) â `watch( $dir, callback => sub { push @paths, shift } )->loop`. РабоÑÐ°ÐµÑ Ð½Ð° `AnyEvent`. ÐаÑÑÑаиваемÑй. ÐÑÑÑ ÑаÑпаÑаллеливание на неÑк...
# * [File::Mirror](https://metacpan.org/pod/File::Mirror) â ÑоÑмиÑÑÐµÑ Ñак же паÑаллелÑнÑй пÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñайлов: `recursive { my ($src, $dst) = @_; push @paths, $src } '/path/A', '/path/B'`.
# * [File::Set](https://metacpan.org/pod/File::Set) â `$fs = File::Set->new; $fs->add($dir); @paths = map { $_->[0] } $fs->get_path_list`.
# * [File::Wildcard](https://metacpan.org/pod/File::Wildcard) â `$fw = File::Wildcard->new(exclude => qr/.svn/, case_insensitive => 1, sort => 1, path => "src///*.cpp", match => qr(^src/(.*?)\.cpp$), derive => ['src/$1.o','src/$1.hpp']); push @path...
# * [File::Wildcard::Find](https://metacpan.org/pod/File::Wildcard::Find) â `findbegin($dir); push @paths, $f while $f = findnext()` или `findbegin($dir); @paths = findall()`.
# * [File::Util](https://metacpan.org/pod/File::Util) â `File::Util->new->list_dir($dir, qw/ --pattern=\.txt$ --files-only --recurse /)`.
# * [Mojo::File](https://metacpan.org/pod/Mojo::File) â `say for path($path)->list_tree({hidden => 1, dir => 1})->each`.
# * [Path::Find](https://metacpan.org/pod/Path::Find) â `@paths = path_find( $dir, "*.png" )`. ÐÐ»Ñ ÑложнÑÑ
запÑоÑов иÑполÑзÑÐµÑ _matchable_: `my $sub = matchable( sub { my( $entry, $directory, $fullname, $depth ) = @_; $d...
# * [Path::Extended::Dir](https://metacpan.org/pod/Path::Extended::Dir) â `@paths = Path::Extended::Dir->new($dir)->find('*.txt')`.
# * [Path::Iterator::Rule](https://metacpan.org/pod/Path::Iterator::Rule) â `$i = Path::Iterator::Rule->new->file; @paths = $i->clone->size(">10k")->all(@dirs); $i->size("<10k")...`.
# * [Path::Class::Each](https://metacpan.org/pod/Path::Class::Each) â `dir($dir)->each(sub { push @paths, "$_" })`.
# * [Path::Class::Iterator](https://metacpan.org/pod/Path::Class::Iterator) â `$i = Path::Class::Iterator->new(root => $dir, depth => 2); until ($i->done) { push @paths, $i->next->stringify }`.
# * [Path::Class::Rule](https://metacpan.org/pod/Path::Class::Rule) â `@paths = Path::Class::Rule->new->file->size(">10k")->all($dir)`.
#
# ## noenter (@filters)
#
# ÐовоÑÐ¸Ñ `find` не вÑ
одиÑÑ Ð² каÑалоги ÑооÑвеÑÑÑвÑÑÑие ÑилÑÑÑам за ним.
#
# ## errorenter (&block)
#
# ÐÑзÑÐ²Ð°ÐµÑ `&block` Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ оÑибки возникаÑÑей пÑи невозможноÑÑи войÑи в какой-либо каÑалог.
#
# ## find_stop ()
#
# ÐÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ `find` бÑдÑÑи вÑзван в одном из его ÑилÑÑÑов, `errorenter` или `noenter`.
#
::done_testing; }; subtest 'find_stop ()' => sub {
my $count = 0;
find "ex", sub { find_stop if ++$count == 3; 1};
local ($::_g0 = do {$count}, $::_e0 = do {3}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '$count # -> 3' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## erase (@paths)
#
# УдалÑÐµÑ ÑÐ°Ð¹Ð»Ñ Ð¸ пÑÑÑÑе каÑалоги. ÐозвÑаÑÐ°ÐµÑ `@paths`. ÐÑи оÑибке ввода-вÑвода вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение.
#
::done_testing; }; subtest 'erase (@paths)' => sub {
::like scalar do {eval { erase "/" }; $@}, qr{erase dir /: Device or resource busy}, 'eval { erase "/" }; $@ # ~> erase dir /: Device or resource busy'; undef $::_g0; undef $::_e0;
::like scalar do {eval { erase "/dev/null" }; $@}, qr{erase file /dev/null: Permission denied}, 'eval { erase "/dev/null" }; $@ # ~> erase file /dev/null: Permission denied'; undef $::_g0; undef $::_e0;
#
# ### See also
#
# * `unlink` + `rmdir`.
# * [File::Path](https://metacpan.org/pod/File::Path) â `remove_tree("dir")`.
# * [File::Path::Tiny](https://metacpan.org/pod/File::Path::Tiny) â `File::Path::Tiny::rm($path)`. Ðе вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑений.
# * [Mojo::File](https://metacpan.org/pod/Mojo::File) â `path($file)->remove`.
#
# ## replace (&sub, @files)
#
# ÐаменÑÐµÑ ÐºÐ°Ð¶Ð´Ñй Ñайл на `$_`, еÑли его изменÑÐµÑ `&sub`. ÐозвÑаÑÐ°ÐµÑ ÑайлÑ, в коÑоÑÑÑ
не бÑло замен.
#
# `@files` Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ Ð¸Ð· двÑÑ
ÑлеменÑов. ÐеÑвÑй ÑаÑÑмаÑÑиваеÑÑÑ ÐºÐ°Ðº пÑÑÑ, а вÑоÑой â как Ñлой. Слой по ÑмолÑÐ°Ð½Ð¸Ñ â `:utf8`.
#
# `&sub` вÑзÑваеÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñайла из `@files`. Ð Ð½ÐµÑ Ð¿ÐµÑедаÑÑÑÑ:
#
# * `$_` â ÑодеÑжимое Ñайла.
# * `$a` â пÑÑÑ Ðº ÑайлÑ.
# * `$b` â Ñлой коÑоÑÑм бÑл ÑÑиÑан Ñайл и коÑоÑÑм он бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸Ñан.
#
# РпÑимеÑе ниже Ñайл "replace.ex" ÑÑиÑÑваеÑÑÑ Ñлоем `:utf8`, а запиÑÑваеÑÑÑ Ñлоем `:raw` в ÑÑнкÑии `replace`:
#
::done_testing; }; subtest 'replace (&sub, @files)' => sub {
t/aion/fs.t view on Meta::CPAN
#
# Ð Ð°Ð·Ð±Ð¸Ð²Ð°ÐµÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð½Ð° ÑоÑÑавлÑÑÑие. ÐиÑекÑоÑÐ¸Ñ ÑледÑÐµÑ Ð²Ð½Ð°Ñале полÑÑиÑÑ Ð¸Ð· `path->{dir}`.
#
::done_testing; }; subtest 'splitdir (;$dir)' => sub {
local $^O = "unix";
local ($::_g0 = do {[ splitdir "/x/" ]}, $::_e0 = do {["", "x", ""]}); ::is_deeply $::_g0, $::_e0, '[ splitdir "/x/" ] # --> ["", "x", ""]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## joindir (;$dirparts)
#
# ÐбÑединÑÐµÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð¸Ð· ÑоÑÑавлÑÑÑиÑ
. ÐаÑем полÑÑеннÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ ÑледÑÐµÑ Ð²ÐºÐ»ÑÑиÑÑ Ð² `path +{dir => $dir}`.
#
::done_testing; }; subtest 'joindir (;$dirparts)' => sub {
local $^O = "unix";
local ($::_g0 = do {joindir qw/x y z/}, $::_e0 = "x/y/z"); ::ok $::_g0 eq $::_e0, 'joindir qw/x y z/ # => x/y/z' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {path +{ dir => joindir qw/x y z/ }}, $::_e0 = "x/y/z/"); ::ok $::_g0 eq $::_e0, 'path +{ dir => joindir qw/x y z/ } # => x/y/z/' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## splitext (;$ext)
#
# Ð Ð°Ð·Ð±Ð¸Ð²Ð°ÐµÑ ÑаÑÑиÑение на ÑоÑÑавлÑÑÑие. РаÑÑиÑение ÑледÑÐµÑ Ð²Ð½Ð°Ñале полÑÑиÑÑ Ð¸Ð· `path->{ext}`.
#
::done_testing; }; subtest 'splitext (;$ext)' => sub {
local $^O = "unix";
local ($::_g0 = do {[ splitext ".x." ]}, $::_e0 = do {["", "x", ""]}); ::is_deeply $::_g0, $::_e0, '[ splitext ".x." ] # --> ["", "x", ""]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## joinext (;$extparts)
#
# ÐбÑединÑÐµÑ ÑаÑÑиÑение из ÑоÑÑавлÑÑÑиÑ
. ÐаÑем полÑÑенное ÑаÑÑиÑение ÑледÑÐµÑ Ð²ÐºÐ»ÑÑиÑÑ Ð² `path +{ext => $ext}`.
#
::done_testing; }; subtest 'joinext (;$extparts)' => sub {
local $^O = "unix";
local ($::_g0 = do {joinext qw/x y z/}, $::_e0 = "x.y.z"); ::ok $::_g0 eq $::_e0, 'joinext qw/x y z/ # => x.y.z' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {path +{ ext => joinext qw/x y z/ }}, $::_e0 = ".x.y.z"); ::ok $::_g0 eq $::_e0, 'path +{ ext => joinext qw/x y z/ } # => .x.y.z' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## include (;$pkg)
#
# ÐодклÑÑÐ°ÐµÑ `$pkg` (еÑли он еÑÑ Ð½Ðµ бÑл подклÑÑÑн ÑеÑез `use` или `require`) и возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾. Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
#
# Файл lib/A.pm:
#@> lib/A.pm
#>> package A;
#>> sub new { bless {@_}, shift }
#>> 1;
#@< EOF
#
# Файл lib/N.pm:
#@> lib/N.pm
#>> package N;
#>> sub ex { 123 }
#>> 1;
#@< EOF
#
::done_testing; }; subtest 'include (;$pkg)' => sub {
use lib "lib";
::like scalar do {include("A")->new}, qr{A=HASH\(0x\w+\)}, 'include("A")->new # ~> A=HASH\(0x\w+\)'; undef $::_g0; undef $::_e0;
local ($::_g0 = do {[map include, qw/A N/]}, $::_e0 = do {[qw/A N/]}); ::is_deeply $::_g0, $::_e0, '[map include, qw/A N/] # --> [qw/A N/]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {{ local $_="N"; include->ex }}, $::_e0 = do {123}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '{ local $_="N"; include->ex } # -> 123' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## catonce (;$file)
#
# СÑиÑÑÐ²Ð°ÐµÑ Ñайл в пеÑвÑй Ñаз. ÐÑÐ±Ð°Ñ Ð¿Ð¾ÑледÑÑÑÐ°Ñ Ð¿Ð¾Ð¿ÑÑка ÑÑиÑаÑÑ ÑÑÐ¾Ñ Ñайл возвÑаÑÐ°ÐµÑ `undef`. ÐÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²ÑÑавки модÑлей js и css в ÑезÑÐ...
#
# * `$file` Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ Ð¸Ð· двÑÑ
ÑлеменÑов. ÐеÑвÑй ÑаÑÑмаÑÑиваеÑÑÑ ÐºÐ°Ðº пÑÑÑ, а вÑоÑой â как Ñлой. Слой по ÑмолÑÐ°Ð½Ð¸Ñ â `:utf8`.
# * ÐÑли `$file` не Ñказан â иÑполÑзÑÐµÑ `$_`.
#
::done_testing; }; subtest 'catonce (;$file)' => sub {
local $_ = "catonce.txt";
lay "result";
local ($::_g0 = do {catonce}, $::_e0 = do {"result"}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'catonce # -> "result"' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {catonce}, $::_e0 = do {undef}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'catonce # -> undef' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
::like scalar do {eval { catonce[] }; $@}, qr{catonce not use ref path\!}, 'eval { catonce[] }; $@ # ~> catonce not use ref path!'; undef $::_g0; undef $::_e0;
#
# ## wildcard (;$wildcard)
#
# ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ ÑайловÑÑ Ð¼Ð°ÑÐºÑ Ð² ÑегÑлÑÑное вÑÑажение. Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
#
# * `**` - `[^/]*`
# * `*` - `.*`
# * `?` - `.`
# * `??` - `[^/]`
# * `{` - `(`
# * `}` - `)`
# * `,` - `|`
# * ÐÑÑалÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑкÑаниÑÑÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ `quotemeta`.
#
::done_testing; }; subtest 'wildcard (;$wildcard)' => sub {
local ($::_g0 = do {wildcard "*.{pm,pl}"}, $::_e0 = '(?^usn:^.*?\.(pm|pl)$)'); ::ok $::_g0 eq $::_e0, 'wildcard "*.{pm,pl}" # \> (?^usn:^.*?\.(pm|pl)$)' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {wildcard "?_??_**"}, $::_e0 = '(?^usn:^._[^/]_[^/]*?$)'); ::ok $::_g0 eq $::_e0, 'wildcard "?_??_**" # \> (?^usn:^._[^/]_[^/]*?$)' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ÐÑполÑзÑеÑÑÑ Ð² ÑилÑÑÑаÑ
ÑÑнкÑии `find`.
#
# ### See also
#
# * [File::Wildcard](https://metacpan.org/pod/File::Wildcard).
# * [String::Wildcard::Bash](https://metacpan.org/pod/String::Wildcard::Bash).
# * [Text::Glob](https://metacpan.org/pod/Text::Glob) â `glob_to_regex("*.{pm,pl}")`.
#
# ## goto_editor ($path, $line)
#
# ÐÑкÑÑÐ²Ð°ÐµÑ Ñайл в ÑедакÑоÑе из .config на Ñказанной ÑÑÑоке. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑÐµÑ `vscodium %p:%l`.
#
# Файл .config.pm:
#@> .config.pm
#>> package config;
#>>
#>> config_module 'Aion::Fs' => {
#>> EDITOR => 'echo %p:%l > ed.txt',
#>> };
#>>
#>> 1;
#@< EOF
#
::done_testing; }; subtest 'goto_editor ($path, $line)' => sub {
goto_editor "mypath", 10;
local ($::_g0 = do {cat "ed.txt"}, $::_e0 = "mypath:10\n"); ::ok $::_g0 eq $::_e0, 'cat "ed.txt" # => mypath:10\n' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
::like scalar do {eval { goto_editor "`", 1 }; $@}, qr{`:1 --> 512}, 'eval { goto_editor "`", 1 }; $@ # ~> `:1 --> 512'; undef $::_g0; undef $::_e0;
#
# ## from_pkg (;$pkg)
#
# ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð¿Ð°ÐºÐµÑ Ð² пÑÑÑ Ð¤Ð¡. Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
#
::done_testing; }; subtest 'from_pkg (;$pkg)' => sub {
local ($::_g0 = do {from_pkg "Aion::Fs"}, $::_e0 = "Aion/Fs.pm"); ::ok $::_g0 eq $::_e0, 'from_pkg "Aion::Fs" # => Aion/Fs.pm' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {[map from_pkg, "Aion::Fs", "A::B::C"]}, $::_e0 = do {["Aion/Fs.pm", "A/B/C.pm"]}); ::is_deeply $::_g0, $::_e0, '[map from_pkg, "Aion::Fs", "A::B::C"] # --> ["Aion/Fs.pm", "A/B/C.pm"]' or ::diag ::_struct_diff($::_g0, $::_e0); und...
#
# ## to_pkg (;$path)
#
# ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð¿ÑÑÑ Ð¸Ð· ФС в пакеÑ. Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
#
::done_testing; }; subtest 'to_pkg (;$path)' => sub {
local ($::_g0 = do {to_pkg "Aion/Fs.pm"}, $::_e0 = "Aion::Fs"); ::ok $::_g0 eq $::_e0, 'to_pkg "Aion/Fs.pm" # => Aion::Fs' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {[map to_pkg, "Aion/Fs.md", "A/B/C.md"]}, $::_e0 = do {["Aion::Fs", "A::B::C"]}); ::is_deeply $::_g0, $::_e0, '[map to_pkg, "Aion/Fs.md", "A/B/C.md"] # --> ["Aion::Fs", "A::B::C"]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $...
#
# ## from_inc (;$pkg)
#
# ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð¿Ð°ÐºÐµÑ Ð² пÑÑÑ Ð¤Ð¡ в `@INC`. Файл Ñ Ð¿Ð°ÐºÐµÑом должен ÑÑÑеÑÑвоваÑÑ Ð² одном из пÑÑей `@INC`. Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
#
::done_testing; }; subtest 'from_inc (;$pkg)' => sub {
local ($::_g0 = do {from_inc "Aion::Fs"}, $::_e0 = do {$INC{'Aion/Fs.pm'}}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'from_inc "Aion::Fs" # -> $INC{\'Aion/Fs.pm\'}' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $:...
local ($::_g0 = do {[map from_inc, "A::B::C", "Aion::Fs"]}, $::_e0 = do {[$INC{'Aion/Fs.pm'}]}); ::is_deeply $::_g0, $::_e0, '[map from_inc, "A::B::C", "Aion::Fs"] # --> [$INC{\'Aion/Fs.pm\'}]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0;...
local ($::_g0 = do {from_inc "A::B::C"}, $::_e0 = do {undef}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'from_inc "A::B::C" # -> undef' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## to_inc (;$path)
#
# ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð¿ÑÑÑ Ð¸Ð· ФС в `@INC` в пакеÑ. Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
#
::done_testing; }; subtest 'to_inc (;$path)' => sub {
local ($::_g0 = do {to_inc $INC{'Aion/Fs.pm'}}, $::_e0 = "Aion::Fs"); ::ok $::_g0 eq $::_e0, 'to_inc $INC{\'Aion/Fs.pm\'} # => Aion::Fs' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {[map to_inc,"A/B/C.pm", $INC{'Aion/Fs.pm'}]}, $::_e0 = do {["Aion::Fs"]}); ::is_deeply $::_g0, $::_e0, '[map to_inc,"A/B/C.pm", $INC{\'Aion/Fs.pm\'}] # --> ["Aion::Fs"]' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; und...
local ($::_g0 = do {to_inc 'Aion/Fs.pm'}, $::_e0 = do {undef}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'to_inc \'Aion/Fs.pm\' # -> undef' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## ilay (;$path)
#
# СоздаÑÑ ÑайловÑй деÑкÑипÑоÑ. Ðн ÑÐ¼ÐµÐµÑ Ð·Ð°ÐºÑÑваÑÑÑÑ, как ÑолÑко на него иÑÑÐµÐ·Ð½ÐµÑ Ð¿Ð¾ÑледнÑÑ ÑÑÑлка.
#
# Так же Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑод `path`, к-й возвÑаÑÐ°ÐµÑ Ð¿ÑÑÑ Ðº ÑайлÑ.
#
::done_testing; }; subtest 'ilay (;$path)' => sub {
my $test_file = "test_ilay_complete.txt";
my $f = ilay $test_file;
print $f "Line 1\n";
print $f "Line 2\n";
my $std = select $f; $| = 1; select $std;
local ($::_g0 = do {-s $f}, $::_e0 = do {14}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '-s $f # -> 14' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {$f->path}, $::_e0 = "test_ilay_complete.txt"); ::ok $::_g0 eq $::_e0, '$f->path # => test_ilay_complete.txt' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {fileno($f) > 0}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'fileno($f) > 0 # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
undef $f;
local ($::_g0 = do {cat $test_file}, $::_e0 = "Line 1\nLine 2\n"); ::ok $::_g0 eq $::_e0, 'cat $test_file # => Line 1\nLine 2\n' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local $_ = [$test_file, ':raw'];
my $f = ilay;
my $str = "string";
my $num = 42;
my $end = "END";
*FD = *$f{IO};
format FD =
@<<<<<<<< @||||| @>>>>>
$str, $num, $end
.
write FD;
$str = 'int';
write FD;
undef *FD;
undef $f;
my $table = << 'TABLE';
string 42 END
int 42 END
TABLE
local ($::_g0 = do {cat $test_file}, $::_e0 = do {$table}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'cat $test_file # -> $table' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ### See also
#
# * [IO::Handle](https://perldoc.perl.org/IO::Handle).
( run in 3.266 seconds using v1.01-cache-2.11-cpan-99c4e6809bf )