我正在构建一个依赖于 Moose 的 Perl 应用程序。 Moose 对象需要完成的一项任务是使用 File::Find 用文件列表填充属性。我在弄清楚如何使用 find 的 \&wanted
代码引用时遇到了一些麻烦,该代码引用将使我能够保持对 Moose 对象的 $self
版本的访问。
到目前为止,我有这个:
#!/usr/bin/perl
package MyMoose;
use Modern::Perl;
use Moose;
use File::Find;
use FindBin qw($Bin);
### Attribute to hold the file list
has "file_list" => (
is => 'rw',
isa => 'ArrayRef',
default => sub {[]}
);
### Method to populate the file list
sub update_file_list {
my $self = shift;
find(\&wanted, $Bin);
}
### File::Find wanted sub
sub wanted {
### This won't work, but shows what I'd like to do
# my $self = shift;
# ### Do some filtering
# push @{$self->file_list}, $File::Find::name;
}
1;
######################################################################
### Main package to test the object.
package main;
use Data::Dumper;
run_main() unless caller();
sub run_main {
my $m = MyMoose->new();
$m->update_file_list();
print Dumper $m->file_list;
}
它可以运行,但显然不会组装文件列表。这就是我想弄清楚的部分。
使用 File::Find 的正确方法是什么,这样您就可以在处理过程中访问 Moose 对象?
最佳答案
问题是您无权访问wanted
sub 中的$self
。您可以使用内联闭包和 default
或 builder
来构建列表。
编辑:根据更新的问题更新代码
has "file_list" => (
is => 'rw',
isa => 'ArrayRef',
default => sub {
my $self = shift;
return $self->_get_file_list();
},
);
sub update_file_list {
my $self = shift;
$self->file_list($self->_get_file_list());
}
sub _get_file_list {
my @files;
find(sub { push @files, $File::Find::name }, $Bin);
return \@files;
}
_get_file_list
方法返回找到的文件的 arrayref。它用于 default
和 update_file_list
方法来填充属性。
关于perl - 我如何在 Moose 对象中使用 Perl 的 File::Find?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180107/