Perl Moose:仅在 BUILD 子例程中提到时才设置属性

2024-01-08

我正在构建一个脚本,该脚本以递归方式构建目录的子目录/文件的名称以及这些子目录中的文件的名称作为对象:

package Dir;
use Moose;
use Modern::Perl;
use File;
use strict;
use warnings;

has 'path' => (is => 'ro', isa => 'Str', required => 1); 
has 'name' => (is => 'ro', isa => 'Str', lazy => 1, default => sub { my $self = shift; my ($name) = $self->path =~ /\/([^\/]*)$/; return $name; } );
has 'subdirs' => (is => 'rw', isa => 'ArrayRef[Dir]' );  
has 'files' => (is => 'rw', isa => 'ArrayRef[File]' );  
has 'num_dirs' => (is => 'ro', isa => 'Int', lazy => 1, default => sub { my $self = shift; scalar @{$self->subdirs}; } );


sub BUILD {
  my $self = shift;
  my $path = $self->path;

  # run some tests
  logf('Path to the directory does not exist.')             if (!-e $path);
  logf('The path should point to a directory, not a file.') if (!-d $path);

  # populate subdirs attribute with Dir objects
  opendir my $dh, $path or die "Can't opendir '$path': $!";

  # Get files and dirs and separate them out into categories
  my @dirs_and_files = grep { ! m{^\.$|^\.\.$} } readdir $dh;
  closedir $dh or die "Can't closedir '$path': $!";
  my @subdir_names        = grep { -d "$path/$_" } grep { !m{^\.}  } @dirs_and_files;
  my @file_names          = grep { -f "$path/$_" } grep { !m{^\.}  } @dirs_and_files;

  # Create objects
  my @dir_objects =          map { Dir->new  ( path => $path . '/' . $_ ) } @subdir_names;
  my @file_objects =         map { File->new ( path => $path . '/' . $_ ) } @file_names;

  # Populate this with file and directory objects
  $self->subdirs             ( \@dir_objects );
  $self->files               ( \@file_objects );
}

1;

请注意,代码有一个files属性包含一个数组File对象。 AFile具有以下属性:

has 'path' => (is => 'ro', isa => 'Str', required => 1); 
has 'name' => (is => 'ro', isa => 'Str', lazy => 1, default => sub { my $self = shift; my ($name) = $self->path =~ /\/([^\/]*)$/; return $name; } );

问题是name当 a 时,属性永远不会被设置File对象被创建。我不知道为什么。

编辑1:解决方案(某种程度上)所以,我把这个放进去File对象以查看它是否触发了属性的创建:

sub BUILD {
  my $self = shift;
}

这并没有解决问题。然而,这确实:

sub BUILD {
  my $self = shift;
  $self->name;
}

但我的问题是,为什么我需要这样做?


问题是如果有尾部斜杠,您的模式就会失败。

my ($name) = $self->path =~ /\/([^\/]*)$/;

If $self->path is /some/thing有用。如果它是/some/thing/它“有效”但是[^\/]*愉快地匹配一个空字符串。所以你不会收到任何警告。

您可以输入可选的斜杠,并将其更改为匹配一个或多个非斜杠。另外,通过使用替代分隔符,我们可以清理所有倾斜的牙签。

my ($name) = $self->path =~ m{/ ([^/]+) /? $}x;

但实际上不应该用正则表达式来解析路径。使用许多内置模块之一,例如文件::基本名称 https://metacpan.org/pod/File::Basename or 文件::规格 https://metacpan.org/pod/File::Spec

return basename($self->path);

一些旁注。

Moose 启动速度非常慢,最适合长时间运行的进程,例如 Web 服务器。对于像 File 和 Dir 类这样通用的东西,请考虑使用Moo https://metacpan.org/pod/Moo。它与 Moose 大部分兼容,速度更快,并且与类型::标准 https://metacpan.org/pod/Types::Standard,打字效果更好。例如,最好创建一个 StrNotEmpty 类型来避免此类问题。

除非这是一个练习,否则 Perl 已经有一个很棒的模块来完成此类事情。调查路径::小 https://metacpan.org/pod/Path::Tiny.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl Moose:仅在 BUILD 子例程中提到时才设置属性 的相关文章

  • 如何将文本转换为标题大小写?

    我有一个文本文件 其中包含需要更改为标题大小写的标题列表 单词应以大写字母开头 但大多数冠词 连词和介词除外 例如 这个书名列表 barbarians at the gate hot flat and crowded A DAY LATE
  • 为什么使用自动激活文件句柄的三参数开放调用是 Perl 最佳实践?

    我有两个关于 Perl 的问题open功能 1 我好像记得从Perl 最佳实践的 3 参数版本open比两个参数版本更好 例如 open OUT gt gt file vs open OUT gt gt file 这是为什么 前几天我试图告
  • 如何在 perl 程序中查找打开的全局文件句柄

    我刚刚发现一个问题 我必须关闭所有打开的文件句柄才能让我的 Apache cgi 脚本继续 我将问题追溯到 Parse RecDescent usr bin env perl use strict use warnings use feat
  • 如何在正则表达式中区分数字和ip地址?

    例如 如果我们查看 5 56 和 183 55 0 144 基本上 当你做这样的事情时 d d 它匹配 5 56 189 55 和 0 144 有没有办法通过正则表达式仅匹配数字而不匹配 ip 地址的部分 我尝试使用前瞻 但我不知道它应该是
  • Perl 中的全局变量、子程序变量问题

    如何将子程序变量值转移到另一个子程序变量中 我可以使用全局变量吗 sub foo my myvar Hello sub foo1 my myvar1 myvar how can I get the Hello from myvar 我尝试使
  • 如何为自定义 Perl 模块选择一个不与内置或 CPAN 包名称冲突的包名称?

    我已阅读模块上的 perldoc http perldoc perl org perlmod html 但我没有看到关于命名包的建议 这样它就不会与内置或 CPAN 模块 包名称冲突 过去 为了开发本地Session pm模块 我使用我公司
  • 找不到 DBI.pm

    我正在尝试启动这个脚本 usr bin perl use DBI my dbh DBI gt connect dbi Oracle host lonlin2 sid TIMFX1AD port 1524 xbsesdbo xbsesdbo1
  • 如何在 perl 中合并两个数组,交替每个数组中的值

    假设我有 2 个如下所示的数组 a1 Vinay Raj harry b1 dude rock 合并后我想要这样的结果 Vinay dude Vinay rock Raj dude Raj rock harry dude harry roc
  • 我怎样才能挂钩 Perl 的 use/require 以便抛出异常?

    如果文件已经加载 是否可以挂载到use require所以我可以抛出异常 在我即将到来的nextgen blacklist http github com EvanCarroll nextgen blob blacklist lib nex
  • 在 Ubuntu 中执行 .cgi 文件

    我在 Ubuntu 下运行 Apache PHP 当我运行 cgi 文件时 通过http localhost mycgi cgi 浏览器将显示代码而不是运行它 如何让浏览器执行 CGI 文件而不是显示其内容 将这些行添加到您的 apache
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • 如何在附加的 sqlite 数据库中创建外键?

    我正在尝试创建一个 sqlite3 数据库作为模拟生产环境的测试环境 由于生产的设置方式 表处于多个模式中 我已经在 DBIx Class 中设置了类 使用 schema gt storage gt dbh do将数据库与架构附加在一起 并
  • Perl:测试输入阅读器?

    有没有一种方法可以使用标准 Test 等模块自动测试 Perl 程序是否正在读取输入 例如标准输入正确吗 例如 测试一个从 STDIN 读取两个整数并打印它们之和的程序 这不是 100 清楚你的意思 我会回答假设你想编写一个测试脚本来测试你
  • Perl 正则表达式图灵完备吗?

    我见过 Ruby 和 Perl 程序员做了一些事情复杂的代码挑战 https codegolf stackexchange com questions 3596 regex validating regex完全用正则表达式 这前瞻和后瞻 h
  • 如何在 Perl 中复制整个目录?

    我需要将整个目录复制到某个位置 最好的方法是什么 File Copy正如我所见 仅逐个文件复制 顺便说一句 我在Windows下工作 感谢帮助 也许调查一下文件 复制 递归 http metacpan org pod File Copy R
  • BASH:将数据从平面文件导入模板

    我有一个平面记录文件 每行有 33 行 我需要将此文件格式化为模板中的规格 模板为 DOS 格式 源文件为 NIX 格式 该模板具有必须遵守的特定缩进和间距 我想到了几个选择 BASH 与经典的 nix 工具 sed awk grep 等
  • 如何在 Perl 脚本中加密或隐藏密码?

    我正在研究 Perl 脚本 它使用Expect http search cpan org dist Expect通过 telnet 登录到远程计算机 不要问 必须使用 telnet 我还根据需要执行 perforce p4 登录操作 并使用
  • 使用 Visual Studio Code 调试 Perl

    我今天刚开始使用 Perl 并安装了活动Perl https en wikipedia org wiki ActivePerl5 24 1 一切都很顺利 我能够创建我的测试程序testPerl pl与简单的print命令并运行它consol
  • 打包/解包 - 小端 - 64 位 - 问题

    usr bin env perl use warnings use 5 012 my var 1 lt lt 31 say unpack B pack N var 10000000000000000000000000000000 我怎样才能
  • 如何在 Perl 字符串中手动插入字符串转义符?

    在perl中假设我有一个像这样的字符串 hello tworld n 而我想要的是 hello world 也就是说 hello 然后是文字制表符 然后是 world 然后是文字换行符 或者等价地 hello tworld n 注意双引号

随机推荐

  • 在 flutter 中从父颜色生成自定义色调

    我需要找到一种更好的方法来从给定的自定义颜色生成阴影颜色以用于主题目的 到目前为止 我找到了一种通过降低给定颜色的不透明度来实现此目的的方法 如下所示 所以我可以强调颜色颜色和给定颜色的褪色颜色到此功能 import package flu
  • 如何从主脚本将导入的模块块传输到表面上?

    在我的主文件中 我有一个名为win 我像这样导入一个模块from draw import def draw image x y win blit image x y 这是一个来自draw 它不起作用 因为win没有定义 如何定义它 将目标表
  • ES6导出默认函数

    我可以为每个文件导出多个函数吗 似乎当我这样做时 第二个函数会覆盖第一个函数 例子 在my index js file export default function aFnt console log function a export d
  • Angular 4 - router.url 单元测试

    如何在 Angular 4 单元测试中模拟 router url 我在组件的 ngOninit 中使用 router url 但在我的测试中 router url 的值为 在 Angular v9 中Router url是只读 getter
  • 未找到 Django URL 模式

    我按照教程允许用户注册帐户 但似乎找不到 url 路径 当我设置名称时 它允许我访问 127 0 0 1 8000 accounts signup 但不能访问 127 0 0 1 8000 signup 我尝试将 urlpatterns 从
  • j_spring_security_check HTTP 状态 404(自定义登录)

    我正在使用 Spring 4 Hibernate 4 我检查了每一篇文章 但我无法找出问题所在 Web xml
  • iOS 上有什么好的自定义键盘实现教程吗?

    我需要为区域语言 泰米尔语 制作一个自定义键盘 如果用户按下自定义键盘键 我必须引入泰米尔字体 那可能吗 如果是的话 有可用的教程或资源吗 提前致谢 http cocoacontrols com platforms ios controls
  • R dplyr。过滤包含一列数值向量的数据框

    我有一个数据框 其中一列包含数字向量 我想根据涉及该列的条件过滤行 这是一个简化的示例 df lt data frame id LETTERS 1 3 name c Alice Bob Carol mylist list c 1 2 3 c
  • 使用猫头鹰轮播在触摸设备上滑动时禁用垂直滚动

    我想在移动设备上水平滑动轮播时禁用网页上的垂直滚动 我正在使用猫头鹰旋转木马 我尝试使用 css Overflow hidden 到 html body 但不起作用 尝试了其他解决方案 但它们不起作用 我尝试过的代码在下面 Tried th
  • 日期时间之间的差异

    我这里有一些代码可以计算两个日期时间之间的小时差 这里有点不知所措 代码时好时坏 我不知道为什么 var date tr find td eq 10 input val var time tr find td eq 10 option se
  • 从 doc 和 docx 中提取文本

    我想知道如何阅读 doc 或 docx 的内容 我使用的是 Linux VPS 和 PHP 但如果有使用其他语言的更简单的解决方案 请告诉我 只要它在 Linux 网络服务器下工作即可 在这里我添加了从中获取文本的解决方案 doc docx
  • 包含 13 位数字的字段的正则表达式?

    我需要一个正则表达式来检查字段是否为空或者是否正好是 13 位数字 问候 弗朗西斯 P 尝试这个 另请参阅 rubular com http www rubular com r SYIlg16mHn d 13 解释 是字符串锚点的开头和结尾
  • 在代码中创建 RowDefinitions 和 ColumnDefinitions

    我为Windows Phone开发应用程序 我想创建 2 行 2 列的表 我为此表创建 xaml 代码
  • 使用无障碍 JQuery 在部分视图中显示错误消息时遇到问题

    以下是我在 MVC3 中的区域 Model public class AdminModule Display Name My Name Required public String MyName get set 局部视图 model 1 A
  • protobuf:连续序列化和反序列化到/从套接字

    在消息序列化到套接字 SerializeToFileDescriptor 后 C 客户端和 C 服务器之间的简单通信陷入困境 C 客户端 Person person person set id 54321 person set name b
  • 如何等待 Angular2 处理动态多个 Http 请求?

    我知道你可以通过调用 forkJoin 方法来使用 Observable 来等待多个 http 请求完成 如下所示 getBooksAndMovies Observable forkJoin this http get app books
  • 从 HTML 横向打印

    我有一个 HTML 报告 由于列很多 需要横向打印 有没有办法做到这一点 而无需用户更改文档设置 浏览器有哪些选项 在 CSS 中 您可以设置 page 属性 如下所示 media print page size landscape pag
  • 如何将存储过程中的大量参数从代码传递到 SQL Server

    如何从代码中将大量参数 比如 20 传递给存储过程 就像我们可以将所有参数分组在一个类对象中然后将其传递一样 但是在存储过程的情况下如何实现这样的 this 目前我必须创建 20 多个变量来传递参数 谢谢 阿什瓦尼 如果您使用的是 SQL
  • 宏 if 语句返回错误:运算符“&&”没有正确的操作数

    我在许多 Linux 机器上编译代码 在特定机器上 我收到以下错误 error operator has no right operand 宏代码为 if LINUX VERSION CODE KERNEL VERSION 3 12 49
  • Perl Moose:仅在 BUILD 子例程中提到时才设置属性

    我正在构建一个脚本 该脚本以递归方式构建目录的子目录 文件的名称以及这些子目录中的文件的名称作为对象 package Dir use Moose use Modern Perl use File use strict use warning