虽然我不是Perl大师,但我使用Perl,我可以用"好老"的方式编写面向对象的程序.
现在我想学习穆斯.我已经(所以)咀嚼了基本文档,我的第一个Moose和角色已经在工作了,但我距离了解Moose实际上是如何工作的还有几英里远.
问题1:是否有必要了解Moose如何撰写"相当不错"的节目?
老实说,我不太了解旧的对象系统.我依旧记得读到的东西是它实际上是对数据结构的引用,但我从未深入探索过.这是足以让我知道如何和何时我需要使用bless,autoload等等,事情简单的工作.也许我的一些旧模块可以更有效地编写.但对我来说,他们的工作和工作都很好.
这与穆斯相似吗?或者有人用Moose写"足够好"的程序需要了解它是如何在"内部"工作的吗?
问题出现的原因如下:
在METACPAN中有许多模块可以帮助编写Moose对象更加简单和简单.
随机的例子:
还有很多(不想在这里引用另外10-20个模块)
现在主要问题是:
是否有任何好的书籍,其中包含以下说明,示例和建议(良好做法):
上述模块肯定不是因为作者根本没有做什么而开发的.当然,它们是有用的和有用的.但是学习(阅读:试图理解)数十个不同的模块(特别是那些与Moose内部玩耍的模块)是一个非常漫长的过程.另一方面,如果不使用它们,我的程序将不必要地复杂化,我将处理已经解决的问题.
穆斯应该(并且可能是)一个革命性的体系.只有我开始迷路了.
编辑:我刚刚找到了驯鹿.可能这个模块是问题的部分答案: 从一开始(或大部分时间)使用哪些模块是有用的
PS:我不确定这个问题是否可以.如果没有,请将它移到某处或关闭它.我在这里问过,因为SO-perl社区是一个非常有用的地方,我不知道如何继续学习Moose.
还有另一个perl/utf8问题:
码:
use 5.012;
use utf8;
use strict;
use warnings;
use feature qw(unicode_strings);
use open qw(:std :utf8);
use Encode qw(encode decode);
use charnames qw(:full);
use Unicode::Normalize qw(NFD NFC);
my $name = "\N{U+00C1}"; # Á (UPPERCASE A WITH ACUTE)
opendir(my $dh, ".") || die "error opendir";
while(readdir $dh) {
say "ENC-OK" if decode('UTF-8', $_) =~ $name; #never true
say "NFC-OK" if NFC( decode('UTF-8', $_) ) =~ $name; #true
}
closedir $dh;
Run Code Online (Sandbox Code Playgroud)
上面的代码将为文件Á名中包含的每个文件打印NFC-OK .但永远不会在NFD编码的文件系统上打印ENC-OK,因为opendir永远不会Á以\ x00C1的形式返回,而是"A","重音"......
问题:如何正确编写上述代码适用于任何操作系统?
有一系列哈希,
my @arr = get_from_somewhere();
Run Code Online (Sandbox Code Playgroud)
@arr内容(例如)是:
@arr = (
{ id => "id2", requires => 'someid', text => "another text2" },
{ id => "xid4", requires => 'id2', text => "text44" },
{ id => "someid", requires => undef, text => "some text" },
{ id => "id2", requires => 'someid', text => "another text2" },
{ id => "aid", requires => undef, text => "alone text" },
{ id => "id2", requires => 'someid', text => "another text2" }, …Run Code Online (Sandbox Code Playgroud) 以下是问题:
我有很多不同的字体.其中许多是"ascii only",我需要检查哪些字体包含几个重音字符.(拉丁语 - unicode代码点 - 文本编码为utf8),如:(áäčďéěíĺľňóôöőŕřšťúůüűýž)
主要有:
用perl执行此操作的常用(正确)方法是什么?(这是我所知道的唯一语言,以上问题是针对C).在我开始之前询问所有包含"font":)的CPAN模块.
我在OS X上(如果这很重要,可以安装任何macports包 - 如果有帮助的话).
在任何人告诉我RTFM之前,我必须说 - 我已经挖掘过:
那么,基本代码:
use 5.014; #getting 'unicode_strings' feature
use uni::perl; #turning on many utf8 things
use Unicode::Normalize qw(NFD NFC);
use warnings;
while(<>) {
chomp;
my $data = NFD($_);
say "OK" if utf8::is_utf8($data);
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,从该UTF8编码STDIN我得到了正确的Unicode字符串$data,如"\ W"将与多字节[\p{Alphabetic}\p{Decimal_Number}\p{Letter_Number}](也许更多的东西).那没关系,有效.
据我所知$data没有不包含UTF8,但在一个字符串perl's internal Unicode格式.
现在的问题是:
$other_data包含有效的Unicode字符串?据我所知, …
我还在学习perl.
对我来说,引用哈希感觉更"自然"而不是直接访问它们,因为将引用传递给子句更容易(可以传递一个变量而不是列表).一般来说,我更喜欢这种方法,直接访问%hashes".
问题是,在哪里(在什么情况下)使用普通%哈希更好,所以
$hash{key} = $value;
Run Code Online (Sandbox Code Playgroud)
代替
$href->{key} = $value
Run Code Online (Sandbox Code Playgroud)
在这里是任何速度,或任何其他"东西"更喜欢使用%hashes和不是$hashrefs?或只是纯粹的个人品味和TIMTOWTDI的问题?一些例子,什么时候更好用%hash?
是否有除Catalyst之外的任何Perl Web开发框架:
Moose或者是Catalyst在仅在镇的家伙?:)
据我所知,Dancer,Mojolicious,Jifty不是麋核心
key = value使用以下规则在任意文本中需要匹配对.
( |\t)++字符和一个空格VAR或CONSTkey和value使用=性质例子:
+ VAR somename = somevalue (indented with two spaces)
+ VAR name3 = indented by one \t
Run Code Online (Sandbox Code Playgroud)
以下正则表达式匹配这些行:
/^( |\t)+\+\s+(VAR|CONST)\s+(\w+)\s*=\s*(.*)$/
Run Code Online (Sandbox Code Playgroud)
现在的问题是:语法允许连续行,例如当上面的行后面是至少有一个缩进序列( |\t)(也就是两个空格或一个制表符)的行被认为是一个连续行及其整个内容(带有前导空格) )应该是value前一行中的键.
例:
+ VAR multi = 3 line value where the continuation lines
are indented (starts with two spaces or one tab)
and NOT followed by the …Run Code Online (Sandbox Code Playgroud) 让我们创建一些测试目录树:
#!/bin/bash
top="./testdir"
[[ -e "$top" ]] && { echo "$top already exists!" >&2; exit 1; }
mkfile() { printf "%s\n" $(basename "$1") > "$1"; }
mkdir -p "$top"/d1/d1{1,2}
mkdir -p "$top"/d2/d1some/d12copy
mkfile "$top/d1/d12/a"
mkfile "$top/d1/d12/b"
mkfile "$top/d2/d1some/d12copy/a"
mkfile "$top/d2/d1some/d12copy/b"
mkfile "$top/d2/x"
mkfile "$top/z"
Run Code Online (Sandbox Code Playgroud)
结构是: find testdir \( -type d -printf "%p/\n" , -type f -print \)
testdir/
testdir/d1/
testdir/d1/d11/
testdir/d1/d12/
testdir/d1/d12/a
testdir/d1/d12/b
testdir/d2/
testdir/d2/d1some/
testdir/d2/d1some/d12copy/
testdir/d2/d1some/d12copy/a
testdir/d2/d1some/d12copy/b
testdir/d2/x
testdir/z
Run Code Online (Sandbox Code Playgroud)
我需要找到重复的目录,但我只需要考虑文件(例如,我应该忽略没有文件的(子)目录).因此,从上面的测试树中得到的结果是:
duplicate directories:
testdir/d1
testdir/d2/d1some
Run Code Online (Sandbox Code Playgroud)
因为在两个(子)树中只有两个相同的文件a和 …
作为标题 - 请任何人解释下一个脚本的工作原理
这打印文字:"Perl家伙很聪明"
''=~('(?{'.('])@@^{'^'-[).*[').'"'.('-[)@{:__({:)[{(-:)^}'^'}>[,[]*&[[[[>[[@[[*_').',$/})')
Run Code Online (Sandbox Code Playgroud)
这只打印"b"
use strict;
use warnings;
''=~('(?{'.('_/).+{'^'/]@@_[').'"'.('=^'^'_|').',$/})')
Run Code Online (Sandbox Code Playgroud)
perl -MO = Deparse只显示:
use warnings;
use strict 'refs';
'' =~ m[(?{print "b",$/})];
Run Code Online (Sandbox Code Playgroud)
但不知道为什么......;(
像脚本一样分解的推荐方法是什么?怎么开始?
所以试过这个:
'' =~
(
'(?{'
.
(
'])@@^{' ^ '-[).*['
)
.
'"'
.
(
'-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'
)
.
',$/})'
)
Run Code Online (Sandbox Code Playgroud)
几个部分连接在一起..按位的结果^可能给出了文本部分.的:
perl -e "print '-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'"
Run Code Online (Sandbox Code Playgroud)
打印"Perl家伙很聪明",第一次^产生"打印".
但是,当我重写它时:
'' =~
(
'(?{'
.
(
'print'
)
.
'"'
.
(
'Perl guys are smart'
) …Run Code Online (Sandbox Code Playgroud)