Aion-Fs
view release on metacpan or search on metacpan
[](https://github.com/darviarush/perl-aion-fs/actions) [](https:...
# NAME
Aion::Fs - ÑÑилиÑÑ Ð´Ð»Ñ Ñайловой ÑиÑÑемÑ: ÑÑение, запиÑÑ, поиÑк, замена Ñайлов и Ñ.д.
# VERSION
0.2.3
# SYNOPSIS
```perl
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 !]
my @dirs;
my $iter = find "hello", "-d";
while(<$iter>) {
push @dirs, $_;
}
\@dirs; # --> [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)
СÑиÑÑÐ²Ð°ÐµÑ Ñайл. ÐÑли паÑамеÑÑ Ð½Ðµ Ñказан, иÑполÑзÑÐµÑ `$_`.
```perl
cat "/etc/passwd" # ~> root
```
`cat` ÑиÑÐ°ÐµÑ Ñо Ñлоем `:utf8`. Ðо можно ÑказаÑÑ Ð´ÑÑгой Ñлой ÑледÑÑÑим обÑазом:
```perl
lay "unicode.txt", "â¯";
length cat "unicode.txt" # -> 1
length cat["unicode.txt", ":raw"] # -> 3
```
`cat` вÑзÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение в ÑлÑÑае оÑибки опеÑаÑии ввода-вÑвода:
```perl
eval { cat "A" }; $@ # ~> cat A: No such file or directory
```
### See also
* [autodie](https://metacpan.org/pod/autodie) â `open $f, "r.txt"; $s = join "", <$f>; close $f`.
* [File::Slurp](https://metacpan.org/pod/File::Slurp) â `read_file('file.txt')`.
* [File::Slurper](https://metacpan.org/pod/File::Slurper) â `read_text('file.txt')`, `read_binary('file.txt')`.
* [File::Util](https://metacpan.org/pod/File::Util) â `File::Util->new->load_file(file => 'file.txt')`.
* [IO::All](https://metacpan.org/pod/IO::All) â `io('file.txt') > $contents`.
* [IO::Util](https://metacpan.org/pod/IO::Util) â `$contents = ${ slurp 'file.txt' }`.
* [Mojo::File](https://metacpan.org/pod/Mojo::File) â `path($file)->slurp`.
## lay ($file?, $content)
ÐапиÑÑÐ²Ð°ÐµÑ `$content` в `$file`.
* ÐÑли Ñказан один паÑамеÑÑ, иÑполÑзÑÐµÑ `$_` вмеÑÑо `$file`.
* `lay`, иÑполÑзÑÐµÑ Ñлой `:utf8`. ÐÐ»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¸Ð½Ð¾Ð³Ð¾ ÑÐ»Ð¾Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¼Ð°ÑÑив из двÑÑ
ÑлеменÑов в паÑамеÑÑе `$file`:
```perl
lay "unicode.txt", "â¯" # => unicode.txt
lay ["unicode.txt", ":raw"], "â¯" # => unicode.txt
eval { lay "/", "â¯" }; $@ # ~> lay /: Is a directory
```
### 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, Ñо вÑбÑаÑÑваеÑÑÑ Ð¸ÑклÑÑение:
```perl
eval { find "example", "-h" }; $@ # ~> Undefined subroutine &Aion::Fs::h called
```
Ð ÑÑом пÑимеÑе `find` не Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð¹Ñи в подкаÑалог и пеÑедаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð² ÑÑнкÑÐ¸Ñ `errorenter` (Ñм. ниже) Ñ ÑÑÑановленнÑми пеÑеменнÑми `$_` и `$!` (пÑÑÑм к Ð...
**Ðнимание!** ÐÑли `errorenter` не Ñказана, Ñо вÑе оÑибки **игноÑиÑÑÑÑÑÑ**!
```perl
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};
$count # -> 3
```
### 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($dir1,...
* [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 }; F...
* [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 @paths,...
* [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 ) = @_; $dep...
* [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`.
```perl
my $count = 0;
find "ex", sub { find_stop if ++$count == 3; 1};
$count # -> 3
```
## erase (@paths)
УдалÑÐµÑ ÑÐ°Ð¹Ð»Ñ Ð¸ пÑÑÑÑе каÑалоги. ÐозвÑаÑÐ°ÐµÑ `@paths`. ÐÑи оÑибке ввода-вÑвода вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение.
```perl
eval { erase "/" }; $@ # ~> erase dir /: Device or resource busy
eval { erase "/dev/null" }; $@ # ~> erase file /dev/null: Permission denied
```
### 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`:
```perl
local $_ = "replace.ex";
lay "abc";
replace { $b = ":utf8"; y/a/¡/ } [$_, ":raw"];
cat # => ¡bc
```
### See also
* [File::Edit](https://metacpan.org/pod/File::Edit) â `File::Edit->new($file)->replace('x', 'y')->save`.
* [File::Edit::Portable](https://metacpan.org/pod/File::Edit::Portable) â `File::Edit::Portable->new->splice(file => $file, line => 10, contens => ["line1", "line2"])`.
* [File::Replace](https://metacpan.org/pod/File::Replace) â `($infh,$outfh,$repl) = replace3($file); while (<$infh>) { print $outfh "X: $_" } $repl->finish`.
* [File::Replace::Inplace](https://metacpan.org/pod/File::Replace::Inplace).
## mkpath (;$path)
Ðак **mkdir -p**, но ÑÑиÑÐ°ÐµÑ Ð¿Ð¾ÑледнÑÑ ÑаÑÑÑ Ð¿ÑÑи (поÑле поÑледней коÑой ÑеÑÑÑ) именем Ñайла и не ÑоздаÑÑ ÐµÑ ÐºÐ°Ñалогом. Ðез паÑамеÑÑа иÑполÑзÑе...
* ÐÑли `$path` не Ñказан, иÑполÑзÑÐµÑ `$_`.
* ÐÑли `$path` ÑвлÑеÑÑÑ ÑÑÑлкой на маÑÑив, Ñогда иÑполÑзÑеÑÑÑ Ð¿ÑÑÑ Ð² каÑеÑÑве пеÑвого ÑлеменÑа и пÑава в каÑеÑÑве вÑоÑого ÑлеменÑа.
* ÐÑава по ÑмолÑÐ°Ð½Ð¸Ñ â `0755`.
* ÐозвÑаÑÐ°ÐµÑ `$path`.
```perl
local $_ = ["A", 0755];
mkpath # => A
eval { mkpath "/A/" }; $@ # ~> mkpath /A: Permission denied
mkpath "A///./file";
-d "A" # -> 1
```
### See also
* [File::Path](https://metacpan.org/pod/File::Path) â `mkpath("dir1/dir2")`.
* [File::Path::Tiny](https://metacpan.org/pod/File::Path::Tiny) â `File::Path::Tiny::mk($path)`. Ðе вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑений.
## mtime (;$path)
ÐÑÐµÐ¼Ñ Ð¼Ð¾Ð´Ð¸ÑикаÑии `$path` в unixtime Ñ Ð´Ñобной ÑаÑÑÑÑ (из `Time::HiRes::stat`). Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
ÐÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение, еÑли Ñайл не ÑÑÑеÑÑвÑÐµÑ Ð¸Ð»Ð¸ Ð½ÐµÑ Ð¿Ñав:
```perl
local $_ = "nofile";
eval { mtime }; $@ # ~> mtime nofile: No such file or directory
mtime ["/"] # ~> ^\d+(\.\d+)?$
```
### See also
* `-M` â `-M "file.txt"`, `-M _` в днÑÑ
Ð¾Ñ ÑекÑÑего вÑемени.
* [stat](https://metacpan.org/pod/stat) â `(stat "file.txt")[9]` в ÑекÑндаÑ
(unixtime).
* [Time::HiRes](https://metacpan.org/pod/Time::HiRes) â `(Time::HiRes::stat "file.txt")[9]` в ÑекÑндаÑ
Ñ Ð´Ñобной ÑаÑÑÑÑ.
* [Mojo::File](https://metacpan.org/pod/Mojo::File) â `path($file)->stat->mtime`.
## sta (;$path)
ÐозвÑаÑÐ°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¾ Ñайле. Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
ЧÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло иÑполÑзоваÑÑ Ñ Ð´ÑÑгими ÑайловÑми ÑÑнкÑиÑми, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° маÑÑив из коÑоÑого беÑÑÑ Ð¿ÐµÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² каÑеÑÑв...
## joindir (;$dirparts)
ÐбÑединÑÐµÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ Ð¸Ð· ÑоÑÑавлÑÑÑиÑ
. ÐаÑем полÑÑеннÑÑ Ð´Ð¸ÑекÑоÑÐ¸Ñ ÑледÑÐµÑ Ð²ÐºÐ»ÑÑиÑÑ Ð² `path +{dir => $dir}`.
```perl
local $^O = "unix";
joindir qw/x y z/ # => x/y/z
path +{ dir => joindir qw/x y z/ } # => x/y/z/
```
## splitext (;$ext)
Ð Ð°Ð·Ð±Ð¸Ð²Ð°ÐµÑ ÑаÑÑиÑение на ÑоÑÑавлÑÑÑие. РаÑÑиÑение ÑледÑÐµÑ Ð²Ð½Ð°Ñале полÑÑиÑÑ Ð¸Ð· `path->{ext}`.
```perl
local $^O = "unix";
[ splitext ".x." ] # --> ["", "x", ""]
```
## joinext (;$extparts)
ÐбÑединÑÐµÑ ÑаÑÑиÑение из ÑоÑÑавлÑÑÑиÑ
. ÐаÑем полÑÑенное ÑаÑÑиÑение ÑледÑÐµÑ Ð²ÐºÐ»ÑÑиÑÑ Ð² `path +{ext => $ext}`.
```perl
local $^O = "unix";
joinext qw/x y z/ # => x.y.z
path +{ ext => joinext qw/x y z/ } # => .x.y.z
```
## include (;$pkg)
ÐодклÑÑÐ°ÐµÑ `$pkg` (еÑли он еÑÑ Ð½Ðµ бÑл подклÑÑÑн ÑеÑез `use` или `require`) и возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾. Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
Файл lib/A.pm:
```perl
package A;
sub new { bless {@_}, shift }
1;
```
Файл lib/N.pm:
```perl
package N;
sub ex { 123 }
1;
```
```perl
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 в ÑезÑлÑ...
* `$file` Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ Ð¸Ð· двÑÑ
ÑлеменÑов. ÐеÑвÑй ÑаÑÑмаÑÑиваеÑÑÑ ÐºÐ°Ðº пÑÑÑ, а вÑоÑой â как Ñлой. Слой по ÑмолÑÐ°Ð½Ð¸Ñ â `:utf8`.
* ÐÑли `$file` не Ñказан â иÑполÑзÑÐµÑ `$_`.
```perl
local $_ = "catonce.txt";
lay "result";
catonce # -> "result"
catonce # -> undef
eval { catonce[] }; $@ # ~> catonce not use ref path!
```
## wildcard (;$wildcard)
ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ ÑайловÑÑ Ð¼Ð°ÑÐºÑ Ð² ÑегÑлÑÑное вÑÑажение. Ðез паÑамеÑÑа иÑполÑзÑÐµÑ `$_`.
* `**` - `[^/]*`
* `*` - `.*`
* `?` - `.`
* `??` - `[^/]`
* `{` - `(`
* `}` - `)`
* `,` - `|`
* ÐÑÑалÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑкÑаниÑÑÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ `quotemeta`.
```perl
wildcard "*.{pm,pl}" # \> (?^usn:^.*?\.(pm|pl)$)
wildcard "?_??_**" # \> (?^usn:^._[^/]_[^/]*?$)
```
ÐÑполÑзÑеÑÑÑ Ð² ÑилÑÑÑаÑ
ÑÑнкÑии `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:
```perl
package config;
config_module 'Aion::Fs' => {
EDITOR => 'echo %p:%l > ed.txt',
};
1;
```
```perl
goto_editor "mypath", 10;
cat "ed.txt" # => mypath:10\n
eval { goto_editor "`", 1 }; $@ # ~> `:1 --> 512
```
## from_pkg (;$pkg)
( run in 1.681 second using v1.01-cache-2.11-cpan-39bf76dae61 )