perl - 我如何在 Moose 对象中使用 Perl 的 File::Find?

标签 perl moose

我正在构建一个依赖于 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。您可以使用内联闭包和 defaultbuilder 来构建列表。

编辑:根据更新的问题更新代码

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。它用于 defaultupdate_file_list 方法来填充属性。

关于perl - 我如何在 Moose 对象中使用 Perl 的 File::Find?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180107/

相关文章:

perl - Moose 两次应用方法修饰符

perl - Bread::Board - 注入(inject)带有 ArrayRef 类型约束的参数?

perl - 如何为 POST 请求获取正确的 Content-Length

perl - 使用带有 CODE 引用的 Apache::Session 存储 Moose 对象的替代方法

perl - ffmpeg 不能从 php 脚本工作,但可以从命令行工作

javascript - 如何使用 perl 或 javascript 解析行业基础类 (IFC) 文件?

perl - 如何确定在 Moose 构造函数中调用它的上下文?

perl - 我应该先学习 Perl 5 OO 还是 Moose?

regex - Perl 正则表达式 : meaning of "??"

regex - Perl正则表达式如何只转义一些字符