- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个脚本,该脚本以递归方式构建目录的子目录/文件的名称以及这些子目录中的文件的名称作为对象:
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
对象数组。 File
具有以下属性:
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
属性在创建 File
对象时永远不会被设置。我不确定为什么。
编辑 1:解决方案(某种程度上)因此,我将其放入 File
对象中以查看它是否触发了属性的创建:
sub BUILD {
my $self = shift;
}
这并没有解决问题。然而,这确实:
sub BUILD {
my $self = shift;
$self->name;
}
不过,我的问题是为什么我需要这样做?
最佳答案
问题是如果有尾部斜杠,您的模式就会失败。
my ($name) = $self->path =~ /\/([^\/]*)$/;
如果 $self->path
是 /some/thing
它会起作用。如果它是 /some/thing/
它“有效”但是 [^\/]*
很乐意匹配一个空字符串。所以你不会收到任何警告。
您可以输入一个可选的斜杠,并更改它以匹配一个或多个非斜杠。此外,通过使用替代分隔符,我们可以清理所有那些倾斜的牙签。
my ($name) = $self->path =~ m{/ ([^/]+) /? $}x;
但实际上不应该使用正则表达式来解析路径。使用许多内置模块之一,如 File::Basename或 File::Spec
return basename($self->path);
一些旁注。
Moose 启动速度非常慢,最适合长时间运行的进程,如网络服务器。对于像 File 和 Dir 类这样通用的东西,考虑使用 Moo .它主要与 Moose 兼容,速度更快,并且与 Types::Standard 结合使用时, 类型更好。例如,最好创建一个 StrNotEmpty 类型来避免此类问题。
除非这是一个练习,否则 Perl 已经有一个很棒的模块来做这类事情。查看Path::Tiny .
关于Perl 驼鹿 : Attribute only getting set when mentioned in BUILD subroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035292/
如何使用 angular2-mentions 将 URL RouterLink 添加到 @mention 用户。 我的代码是: 如何添加这个: {{contactNames}} 对此有什
我正在尝试实现 jquery.mentions,以便在输入 @ 符号时提示系统中的用户。 一切运行良好,使用 Ajax 查询来填充列表。 但是,编辑现有评论时我很挣扎。 我已将默认文本设置为之前生成的
所以我一直在试图弄清楚这个正则表达式的含义 - 但我并没有走得太远。 (\w+\.?(?:\w+)?) 语言是 Javascript。 我理解这个正则表达式的部分内容 - 它看起来像是捕获点、任何单词
我正在努力想出一个只能在单词开头找到 ampersat 的正则表达式。例如: 这里:@dog 去了公园。 但不是这里:d@og 去了公园。 或者在这里:The@dog 去了公园。 本质上,我只是想捕获
我正在构建一个基本的 Twitter 客户端应用程序。我正在尝试弄清楚如何使包含推文的 TextView 自动链接 @mentions,以便它们链接到与推特网站上相同的任何人的推特页面。我的猜测是,这
尝试用 anchor 标记替换所有出现的@mention,到目前为止我有: $comment = preg_replace('/@([^@ ])? /', '@$1 ', $comment); 采用以
我尝试使用 this 中的 Mention.js . 我的 Search.html 包含, $('#try').mention({ delimiter: '@', users
我想在我的文本区域中显示由单词 @ 触发的自动完成表单,就像这个库 http://ichord.github.io/At.js/但只使用 angularjs 和 css 我应该写什么样的指令?另外,有
我想捕获对@usernames 的提及。用户名有这些规则: 只能使用小写字母、数字或点 (.) 不以点开头或结尾 连续不超过一个点(例如,不允许使用 user..name,但可以使用 us.er.na
我有这个来自 Andrew Whitaker 的自动完成插件 - DEMO 假设我在 textarea 中有一个字符串 "@peterwateber welcome" 我希望它在隐藏标签中输出为 "@
我现在的代码是这样的: var regex = '@([a-z0-9_]+)'; replacedText = replacedText.replace(regex, '$1'); 但是,当我输入“你
StackOverflow 用户, 我意识到新的“@mentions”是 facebook 的一项非常新的功能,但是你们中有人能想到如何使用 Facebook API 访问此功能吗? 我假设需要一个单
我正在尝试为当前登录的用户显示@mentions,但收到语法错误,而且我不知道它是什么。我的数据库是 mysql,我的查询当前如下所示: $sql = "SELECT users.userna
所以我有这个正则表达式 /(?:[\s.]|^)@(\w+\.?(?:\w+))/g 这错误地给出了提及之前的句号 - 例如 .@blah. 是否匹配并捕获了前面的句号。 此外,当我这样做时 - 句子
嘿伙计们,我正在使用这个plugin来自霍基。它就像 Twitter,你可以在其中@提及某人。我的输出有问题。这个方法: updateHidden: function() { var
我正在尝试使用 jquery ajax php 制作一个 facebook 和 twitter 风格的提及系统,但如果我尝试@mention 超过一个用户,我会遇到问题。例如,如果我开始输入如下内容:
我想做什么 我想在聊天 Activity 中提及人和组。当用户输入@时,我想填充不包含用户和 channel 的列表这样他就可以同时提及人和 channel 我做了什么 我从这个问题中得到了帮助And
问题 : 我正在尝试为使用 draft-js 创建的内容创建一个编辑界面+ draft-js-mention-plugin .然而,editorState没有坚持,只有纯文本。提及被保存为对象数组。现
在 Angular 提及库的帮助下,我实现了一个允许我提及多个用户的文本区域。 有没有办法保存选中用户的ID?如果可能,将它们保存为字符串数组。 示例:我选择了用户姓名 1、姓名 2、姓名 3 ...
我正在使用 Rails 3.2 应用程序,我需要为文本区域提供自动建议,以在同一文本区域中获取 @mentions 用户和 #tags。 详细说明:当用户开始输入@ab时...自动建议应该从提供的js
我是一名优秀的程序员,十分优秀!