Perl有助于使用列表/哈希来实现命名参数,我认为这些参数非常优雅,并且对自记录代码有很大的帮助.
my $result = $obj->method( flux_capacitance => 23, general_state => 'confusion', attitude_flags => ATTITUDE_PLEASANT | ATTITUDE_HELPFUL, );
pjf.. 24
我最喜欢的优雅Perl代码不一定非常优雅.它们是优雅的,让你摆脱许多Perl开发人员已经陷入的所有坏习惯.我需要花费数小时或数天的时间来展示他们应得的细节,但作为一个简短的清单,他们包括:
autobox,将Perl的原语转换为一流的对象.
autodie,它导致内置or die...
函数在失败时抛出异常(删除构造的大多数需求).另见我的autodie博客和视频).
Moose,它提供了一种在Perl中编写类的优雅,可扩展和正确的方法.
MooseX :: Declare,它在使用Moose时提供了语法上的自由.
Perl :: Critic,您的个人,自动,可扩展且知识渊博的代码审阅者.另见Perl-tip.
Devel :: NYTProf,它为我提供了我在任何编程语言中看到的最详细和最实用的分析信息.另见Tim Bunce的博客.
PAR,Perl Archiver,用于捆绑发行版,甚至将整个程序转换为独立的可执行文件.另见Perl-tip.
Perl 5.10,它提供了一些令人惊叹的正则表达式改进,智能匹配,switch语句,定义或状态变量.
Padre是唯一集成了上述最佳功能的Perl编辑器,它是跨平台的,完全免费且开源.
如果你懒得跟踪链接,我最近在Linux.conf.au上就上述大部分内容进行了讨论.如果你错过了,那就有一个在线视频(ogg theora).如果你懒得观看视频,我今年作为OSCON的教程做了一个大大扩展的演讲版本(题为正确的做Perl).
祝一切顺利,
保罗
Perl有助于使用列表/哈希来实现命名参数,我认为这些参数非常优雅,并且对自记录代码有很大的帮助.
my $result = $obj->method( flux_capacitance => 23, general_state => 'confusion', attitude_flags => ATTITUDE_PLEASANT | ATTITUDE_HELPFUL, );
我最喜欢的优雅Perl代码不一定非常优雅.它们是优雅的,让你摆脱许多Perl开发人员已经陷入的所有坏习惯.我需要花费数小时或数天的时间来展示他们应得的细节,但作为一个简短的清单,他们包括:
autobox,将Perl的原语转换为一流的对象.
autodie,它导致内置or die...
函数在失败时抛出异常(删除构造的大多数需求).另见我的autodie博客和视频).
Moose,它提供了一种在Perl中编写类的优雅,可扩展和正确的方法.
MooseX :: Declare,它在使用Moose时提供了语法上的自由.
Perl :: Critic,您的个人,自动,可扩展且知识渊博的代码审阅者.另见Perl-tip.
Devel :: NYTProf,它为我提供了我在任何编程语言中看到的最详细和最实用的分析信息.另见Tim Bunce的博客.
PAR,Perl Archiver,用于捆绑发行版,甚至将整个程序转换为独立的可执行文件.另见Perl-tip.
Perl 5.10,它提供了一些令人惊叹的正则表达式改进,智能匹配,switch语句,定义或状态变量.
Padre是唯一集成了上述最佳功能的Perl编辑器,它是跨平台的,完全免费且开源.
如果你懒得跟踪链接,我最近在Linux.conf.au上就上述大部分内容进行了讨论.如果你错过了,那就有一个在线视频(ogg theora).如果你懒得观看视频,我今年作为OSCON的教程做了一个大大扩展的演讲版本(题为正确的做Perl).
祝一切顺利,
保罗
我很惊讶没有人提到Schwartzian变换.
my @sorted = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [ $_, expensive_func($_) ] } @elements;
在没有闷闷的操作员的情况下,
my $file = do { local $/; readline $fh };
有一个用户希望您的程序处理的文件列表?不想意外处理程序,文件夹或不存在的文件?试试这个:
@files = grep { -T } @files;
而且,就像魔术一样,你已经淘汰了所有不合适的条目.不想无声地忽略它们?在最后一行之前添加此行:
warn "Not a file: $_" foreach grep { !-T } @files;
为每个无法处理标准错误的文件打印一条很好的警告消息.没有使用的相同的东西grep
将是这样的:
my @good; foreach(@files) { if(-T) { push @good, $_; } else { warn "Not a file: $_"; } }
grep
(和map
)可以用来使代码更短,同时仍然保持其可读性.
"或死"构造:
open my $fh, "<", $filename or die "could not open $filename: $!";
使用qr //创建语法:
#!/usr/local/ActivePerl-5.10/bin/perl use strict; use warnings; use feature ':5.10'; my $non_zero = qr{[1-9]}; my $zero = qr{0}; my $decimal = qr{[.]}; my $digit = qr{$non_zero+ | $zero}x; my $non_zero_natural = qr{$non_zero+ $digit*}x; my $natural = qr{$non_zero_natural | $zero}x; my $integer = qr{-? $non_zero_natural | $zero}x; my $real = qr{$integer (?: $decimal $digit)?}x; my %number_types = ( natural => qr/^$natural$/, integer => qr/^$integer$/, real => qr/^$real$/ ); for my $n (0, 3.14, -5, 300, "4ever", "-0", "1.2.3") { my @types = grep { $n =~ $number_types{$_} } keys %number_types; if (@types) { say "$n is of type", @types == 1 ? " ": "s ", "@types"; } else { say "$n is not a number"; } }
用于分解重复代码的匿名子例程:
my $body = sub { #some amount of work }; $body->(); $body->() while $continue;
代替
#some amount of work while ($continue) { #some amount of work again }
基于散列的调度表:
my %dispatch = ( foo => \&foo, bar => \&bar, baz => \&baz ); while (my $name = iterator()) { die "$name not implemented" unless exists $dispatch{$name}; $dispatch{$name}->(); }
代替
while (my $name = iterator()) { if ($name eq "foo") { foo(); } elsif ($name eq "bar") { bar(); } elsif ($name eq "baz") { baz(); } else { die "$name not implemented"; } }
我最喜欢的一个例子是Perl实现的阶乘计算器.在Perl 5中,它看起来像这样:
use List::Util qw/reduce/; sub factorial { reduce { $a * $b } 1 .. $_[0]; }
如果数字<= 1或者字符串,则返回false;如果传入数字则返回数字(如果是分数则向下舍入).
期待Perl 6,它看起来像这样:
sub factorial { [*] 1..$^x }
而且(从上面的链接中的博客)你甚至可以实现这个作为运营商:
sub postfix:(Int $x) { [*] 1..($x || 1) }
然后在你的代码中使用它,如下所示:
my $fact5 = 5!;
带有构造函数,getter/setter和类型验证的三行类:
{ package Point; use Moose; has ['x', 'y'] => (isa => 'Num', is => 'rw'); } package main; my $point = Point->new( x => '8', y => '9' ); $point->x(25);
如果你有一个逗号分隔的标志列表,并想要一个查找表,你所要做的就是:
my %lookup = map { $_ => 1 } split /,/, $flags;
现在您可以简单地测试您需要哪些标志,如下所示:
if ( $lookup{FLAG} ) { print "Ayup, got that flag!"; }
我很惊讶没人提到这一点.这是我认为的杰作:
#!/usr/bin/perl $==$'; $;||$.| $|;$_ ='*$ ( ^@(%_+&~~;# ~~/.~~ ;_);;.);;#) ;~~~~;_,.~~,.* +,./|~ ~;_);@-, .;.); ~ ~,./@@-__);@-);~~,.*+,. /|);;;~~@-~~~~;.~~,. /.);;.,./@~~@-;.;#~~@-;; ;;,.*+,./.);;#;./@,./ |~~~~;#-(@-__@-__&$#%^';$__ ='`'&'&';$___="````" |"$[`$["|'`%",';$~=("$___$__-$[``$__"| "$___"| ("$___$__-$[.%")).("'`"|"'$["|"'#"). '/.*?&([^&]*)&.*/$'.++$=.("/``"|"/$[`"|"/#'").(";`/[\\`\\`$__]//`;" |";$[/[\\$[\\`$__]//`;"|";#/[\\\$\\.$__]//'").'@:=("@-","/.", "~~",";#",";;",";.",",.",");","()","*+","__","-(","/@",".%","/|", ";_");@:{@:}=$%..$#:;'.('`'|"$["|'#')."/(..)(..)/".("```"|"``$["| '#("').'(($:{$'.$=.'}<<'.(++$=+$=).')|($:{$'.$=.'}))/'.("```;"| "``$[;"|"%'#;").("````'$__"|"%$[``"|"%&!,").${$[};`$~$__>&$=`;$_= '*$(^@(%_+&@-__~~;#~~@-;.;;,.(),./.,./|,.-();;#~~@-);;;,.;_~~@-,./., ./@,./@~~@-);;;,.(),.;.~~@-,.,.,.;_,./@,.-();;#~~@-,.;_,./|~~@-,. ,.);););@-@-__~~;#~~@-,.,.,.;_);~~~~@-);;;,.(),.*+);;# ~~@-, ./|,.*+,.,.);;;);*+~~@-,.*+,.;;,.;.,./.~~@-,.,.,.;_) ;~~~ ~@-,.;;,.;.,./@,./.);*+,.;.,.;;@-__~~;#~~@-,.;;,.* +);; #);@-,./@,./.);*+~~@-~~.%~~.%~~@-;;__,. /.);;#@- __@- __ ~~;;);/@;#.%;#/.;#-(@-__~~;;;.;_ ;#.%~~~~ ;;() ,.;.,./@,. /@,.;_~~@- ););,.;_ );~~,./ @,. ;;;./@,./| ~~~~;#-(@- __,.,.,. ;_);~~~ ~@ -~~());; #);@-,./@, .*+);;; ~~@-~~ );~~);~~ *+~~@-);-( ~~@-@-_ _~~@- ~~@-);; #,./@,.;., .;.);@ -~~@-; #/.;#-( ~~@-@-__ ~~@-~~ @-);@ -);~~, .*+,./ |);;;~ ~@-~~ ;;;.; _~~@-@ -__);. %;#-( @-__@ -__~~;# ~~@-;; ;#,. ;_,.. %);@-,./@, .*+, ..%, .;.,./|) ;;;) ;;#~ ~@-,.*+,. ,.~~ @-); *+,.;_);;.~ ~);); ~~,.; .~~@-);~~,.;., ./.,.; ;,.*+ ,./|,.); ~~@- );;;,.( ),.*+); ;#~~/|@- __~~;#~~ $';$;;