我仍然是Perl Programming的新手,但我知道Perl 5 OO是如何工作的.但是,我从未用Perl 5 OO创建任何项目,所以我很确定我会遇到很多陷阱.
最近我发现了关于Moose模块的炒作.我查看了一些关于CPAN的文档,我发现它非常有趣并且帮助我作为开发人员.此外,它似乎非常稳定和可靠.
我是否应该加强使用基本的Perl 5 OO语法,直到我对它非常熟悉(知道阶段背后发生了什么),或者您认为我应该继续使用Moose直接开始开发应用程序?或者我应该试试鼠标吗?
对此有任何想法和经验表示赞赏.
提前致谢!
我很难理解OO Perl的交集.my $self = shift;关于这些单独元素的文档很棒,但是我发现它们都没有触及它们如何协同工作.
我一直在使用Moose来创建具有属性的模块,当然,在所述模块中引用模块的属性是有用的.我一遍又一遍地被告知要my $self = shift;在子程序中使用将模块的属性分配给该变量.这是有道理和有效的,但是当我也将参数传递给子例程时,这个过程显然需要@ARGV数组的第一个元素并将它分配给它$self.
有人可以解释我如何使用shift来获取模块属性的内部访问权限,同时还传入@ARGV数组中的参数?
重新提出问题,因为
评论:这个问题已经获得了"流行的问题徽章",所以可能我不是唯一没有希望的人.:)
不幸的是,展示完整的问题堆栈导致了一个非常长的问题,这是非常梅森特定的.
首先,只有意见的部分:)
我使用HTML :: Mason多年,现在尝试使用Mason2.在诗人和梅森 都在CPAN最先进的框架.没有找到任何比较,开箱即用的东西允许写得如此干净/但非常黑客:)/ web-apps,包括许多电池(记录,缓存,配置管理,基于原生PGSI等......)
不幸的是,作者并不关心其余部分,例如默认情况下,它只是基于ascii, 没有任何手册,常见问题或建议:如何使用unicode
现在的事实.演示.创建一个诗人应用程序:
poet new my #the "my" directory is the $poet_root
mkdir -p my/comps/xls
cd my/comps/xls
Run Code Online (Sandbox Code Playgroud)
并添加到dhandler.mc下面(将说明两个基本问题)
<%class>
has 'dwl';
use Excel::Writer::XLSX;
</%class>
<%init>
my $file = $m->path_info;
$file =~ s/[^\w\.]//g;
my $cell = lc join ' ', "ÅNGSTRÖM", "in the", $file;
if( $.dwl ) …Run Code Online (Sandbox Code Playgroud) 我编写了一组使用角色在Moose中实现的类和接口.我无法理解的是Moose特征与角色的使用和实现的确切差异.
该驼鹿文件规定:
重要的是要理解角色和特征是一回事.角色可以用作特征,特征是角色.区分这两者的唯一方法是以一种让Moose将短名称解析为类名的方式打包特征.换句话说,使用特征,调用者可以通过诸如"Big"之类的短名称来引用它,并且Moose会将其解析为类似MooseX :: Embiggen :: Meta :: Attribute :: Role :: Big的类.
我的理解是,特征和角色是"相同的".但是,当使用use Moose -traits 'Foo'语法实现该想法的基本测试时似乎没有做到我期望的那样.当然,我必须在这里遗漏一些东西.
第一个示例失败,"找不到对象方法'foo'"
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
sub foo { warn 'foo' }
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose -traits => 'HasTable';
__PACKAGE__->foo(); #Can't locate object method 'foo'
Run Code Online (Sandbox Code Playgroud)
与此相比(确实有效):
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
sub foo { warn 'foo' }
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose;
with 'MyApp::Meta::Class::Trait::HasTable';
__PACKAGE__->foo(); #foo
Run Code Online (Sandbox Code Playgroud) 我正在学习现代perl - Moose,Plack等.在很多建议中你可以阅读"通过实例学习" - 所以开始搜索一些用Modern perl编写的可立即运行的应用程序.
浏览了很多页面:
还有更多(perl.org等) - 不幸的是 - 我找不到任何用现代perl编写的"准备运行"应用程序.
我没有找到任何Moose/Plack - CMS,既没有ShoppingCart,也没有Blog或任何Web应用程序.很难相信它们不存在,所以我可能在错误的地方寻找.
请问您能指出一些用Modern Perl(不仅仅是框架)编写的"Ready to run"Web应用程序吗?我检查了上面链接中的所有应用程序,没有人是Moose/Plack.
基于催化剂:
其他Moose/Plack应用:
如果你有一个属性需要在它设置的任何时候进行修改,那么是否有一种简单的方法可以自己编写访问器并直接使用内容$self,如本例中所做的那样?
package Foo;
use Moose;
has 'bar' => (
isa => 'Str',
reader => 'get_bar',
);
sub set_bar {
my ($self, $bar) = @_;
$self->{bar} = "modified: $bar";
}
Run Code Online (Sandbox Code Playgroud)
我考虑过trigger,但似乎需要采用相同的方法.
$self在Moose中被认为是不好的做法直接使用哈希引用,还是我担心没有问题?
在听说过Perl生态系统的新部分,比如Moose,DeclareX和Catalyst之后,我认为看看Perl会很好.不幸的是,我能找到的所有介绍材料都是针对Perl 5.8或5.6的,并且对这些较新的框架一无所知 - 更不用说最近的Perl版本中引入的功能,例如~~运营商.对于有兴趣来Perl的人来说,有什么资源可用,并希望从一开始就学习当前最佳实践方法来做事情?
虽然我可以阅读骆驼书的第3版,然后通过成堆的CPAN文档等继续工作,我非常感谢一个不会强迫我学习一堆不赞成的方法的教程事情,只是在我阅读参考手册时转身并再次忘记它们.现实世界的代码已经充分记录并使用Perl的一些新角落也很棒.
我已经开始将一个项目转换为Moose,我注意到的第一件事就是我的批评/整洁测试下地狱了.Moose,Tidy和Critic似乎并不像以前那样喜欢对方.
是否有关于如何使批评/整理更加欣赏穆斯方言的文档?大多数Moose用户做什么?放松/放弃批评更重的Moose模块?自定义政策?
有很多关于MooseX :: Method :: Signatures的讨论,甚至在此之前,像Params :: Validate这样的模块设计用于检查方法或函数的每个参数.我正在考虑使用前者用于我未来的所有Perl代码,无论是个人还是我的工作地点.但我不确定这是否值得付出努力.
我正在考虑我之前看过(和写过)的所有Perl代码,之后不执行此类检查.我很少看到一个模块这样做:
my ($a, $b) = @_;
defined $a or croak '$a must be defined!';
!ref $a or croak '$a must be a scalar!";
...
@_ == 2 or croak "Too many arguments!";
Run Code Online (Sandbox Code Playgroud)
也许是因为没有某种辅助模块它只是太多的工作,但也许是因为在实践中我们不会向函数发送过多的参数,而且我们不会将arrayref发送到期望标量的方法 - 或者如果我们这样做,我们就会use warnings;和我们很快就听到了 - 鸭子打字的方法.
那么Perl类型的检查是否值得追求性能,或者它的优势主要体现在编译的强类型语言(如C或Java)中?
我对任何有使用这些模块并且已经看到使用它们的好处(或没有)的Perl编写经验的人的答案感兴趣; 如果您的公司/项目有任何与类型检查有关的政策; 以及类型检查和性能方面的任何问题.
更新:我最近读了一篇关于这个主题的有趣文章,称为强测试与强打字.忽略轻微的Python偏见,它实质上表明在某些情况下类型检查可能会令人窒息,即使您的程序通过了类型检查,也无法保证正确性 - 正确的测试是唯一可靠的方法.
我想要一些属性(也许这是在这种情况下这是错误的术语)是私有的,也就是说,只有内部用于对象使用 - 不能从外部读取或写入.
例如,考虑一些内部变量,它计算调用任何一组方法的次数.
我应该在哪里以及如何定义这样的变量?
moose ×10
perl ×10
plack ×2
attributes ×1
mason ×1
oop ×1
performance ×1
perl-critic ×1
perl-mouse ×1
perl-tidy ×1
self ×1
shift ×1
typechecking ×1
types ×1
utf-8 ×1