我打算学习Perl 5,因为直到现在我都只使用PHP,所以我想对两种语言之间的差异有所了解。
当PHP作为一组“ Perl hacks”开始时,它显然克隆了一些Perls功能。
语法的主要区别是什么?真的,有了Perl,您就有更多的选择和表达方式的方式了吗?
为什么Perl不再经常用于动态网站?是什么使PHP越来越受欢迎?
我打算学习Perl 5,因为直到现在我都只使用PHP,所以我想对两种语言之间的差异有所了解。
当PHP作为一组“ Perl hacks”开始时,它显然克隆了一些Perls功能。
语法的主要区别是什么?真的,有了Perl,您就有更多的选择和表达方式的方式了吗?
为什么Perl不再经常用于动态网站?是什么使PHP越来越受欢迎?
Answers:
Perl和PHP完全不同。让我们考虑一下Perl 5,因为Perl 6仍在开发中。一些差异,大致按主题分组:
=~
,!~
),报价状(qw
,qx
& C),求幂(**
),串重复(x
)和范围(..
和...
)。PHP有Perl所没有的一些运算符,例如错误抑制运算符(@
),instanceof
(虽然Perl确实有该Universal::isa
方法)和clone
。new
是一个运算符。在Perl中,它是在包中定义的对象创建子例程的常规名称,就语言而言没有什么特别的。Perl逻辑运算符返回其参数,而它们返回 PHP中的布尔值。尝试:
$foo = '' || 'bar';
每种语言。在Perl中,甚至$foo ||= 'default'
可以将$ foo设置为一个值(如果尚未设置)。在PHP中执行此操作的最短方法是$foo = isset($foo) ? $foo : 'default';
(可以在PHP 7.0+中进行更新$foo = $foo ?? 'default'
)
$foo
与@foo
or 不同的变量也是如此%foo
。extract
函数。undefined
(请参见perldata)。PHP数组很少。设置元素不会设置中间元素。array_slice
提取切片并array_splice
分配给切片。local
。goto
。Perl展平列表(请参阅perlsub);对于未展平的数据结构,请使用引用。
@foo = qw(bar baz);
@qux = ('qux', @foo, 'quux'); # @qux is an array containing 4 strings
@bam = ('bug-AWWK!', \@foo, 'fum'); # @bam contains 3 elements: two strings and a array ref
PHP不会展平数组。
BEGIN
,UNITCHECK
,CHECK
,INIT
和END
),其被执行。与PHP auto_prepend_file
和不同auto_append_file
,每种类型的代码块的数量没有限制。另外,代码块是在脚本中定义的,而PHP选项是在服务器和每个目录的配置文件中设置的。$bam[-1]
是数组的最后一个元素。PHP中的负下标与其他任何下标一样。$obj->method(@args)
被翻译成(ref $obj)::method($obj, @args)
。非详尽清单:
$this
在方法中提供特殊变量。Perl将对对象的引用作为方法的第一个参数传递。@ISA
变量动态更改继承。//
是一个运算符。在PHP中,这是单行注释的开始。create_function
函数)提供了可怕的支持,而对闭包不提供任何支持。$@
(eval
而不是try
,die
代替throw
)。该PHP受到Perl的启发,就像《天堂魅影》受到歌剧魅影的启发,或者《怪异啤酒》受到Hamlet的启发一样。在学习Perl时,最好不要考虑PHP的行为细节,否则您会被绊倒。
我的大脑现在很痛,所以我要停下来。
@array = qw(a b c)
做的时候$array[4] = 'e'
,数组的内容并不准确('a', 'b', 'c', undef, 'e')
; 他们是('a', 'b', 'c',
不存在的,'e')
。也就是说,[3]
插槽不包含指向undef的标量的指针。它什么也没有容纳(exists
操作员对此进行测试)。差异不大,但有所不同。:)
$foo
如果尚未设置)的最短方法可能是isset($foo) || $foo='default';
我注意到,大多数PHP与Perl页面似乎都是
PHP比Perl更好,因为<在这里插入la脚原因>
之类的,很少进行合理的比较。
在语法方面,您会发现PHP通常比Perl更容易理解,特别是在您经验不足的情况下。例如,在PHP中修剪字符串前后的空格很简单
$string = trim($string);
在Perl中,它有些神秘
$string =~ s/^\s+//;
$string =~ s/\s+$//;
(我相信这比单行捕获和替换要有效得多,并且也更容易理解。)但是,尽管PHP通常更像英语,但它有时仍然可以作为低级C的包装的根源,例如,strpbrk
并且strspn
可能很少使用,因为大多数PHP涉水者为太深奥的东西编写了自己的等效函数,而不是花时间探索手册。我还想知道那些英语是第二语言的程序员,因为每个人都与Perl等事物并驾齐驱,不得不从头开始学习。
我已经提到了手册。PHP有很好的在线手册,很不幸,它需要它。我仍然会不时提及它,因为它们应该很简单,例如参数顺序或函数命名约定。用Perl,你可能会发现你指的是手动一个不少,你上手,然后有一天,你将有一公顷的时刻,再也不需要它。好吧,至少直到您变得更高级并且意识到不仅有不止一种方法,而且可能还有更好的方法,别人可能已经以这种更好的方法完成了,也许您应该只访问CPAN。
Perl确实有很多选择和表达方式。这不一定是一件好事,尽管如果明智地使用它以及至少一种您可能熟悉的方式,它可使代码更具可读性。您会发现有些样式和习惯用法,我可以衷心推荐阅读Perl Best Practices (较早而不是以后)以及Perl Cookbook,第二版 ,以加快解决常见问题的速度。
我相信Perl在共享主机环境中使用较少的原因是,从历史上看,CGI的速度很慢,并且由于安全和配置问题,主机不愿意安装mod_perl使得PHP成为更具吸引力的选择。然后,这种循环继续进行,更多的人开始学习使用PHP,因为更多的主机提供了PHP,而更多的主机提供了PHP,因为这就是人们想要使用的。如今,FastCGI提出了速度差异和安全性问题,在大多数情况下,PHP也会用尽FastCGI,而不是将其保留在Web服务器的核心中。
不管是这种情况还是其他原因,PHP变得流行起来,并且已经编写了无数的应用程序。对于大多数只希望拥有带有简单博客或图片库的入门级网站的人们来说,PHP就是他们所需要的,因此这就是主机推广的对象。如果需要,没有什么可以阻止您使用Perl(或其他任何选择)。
在企业级别,我怀疑您会在生产中发现太多的PHP(请问,在企业级别上,Facebook只是一个反例)。
$str =~ s/^\s+|\s+$//g;
关于Perl,我最喜欢的事情是它处理数组/列表的方式。这是一个示例,说明如何制作和使用Perl函数(或“子例程”),该函数将其用作参数:
sub multiply
{
my ($arg1, $arg2) = @_; # @_ is the array of arguments
return $arg1 * $arg2;
}
在PHP中,您可以使用进行类似的操作list()
,但这并不完全相同。在Perl中,列表和数组实际上是一样的(通常)。您还可以执行以下操作:
$week_day_name = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")[$week_day_index];
您必须知道的另一个区别是数字/字符串比较运算符。在Perl中,如果使用<
,>
,==
,!=
,<=>
,等,Perl的转换两个操作数为数字。如果你想为字符串转换代替,你必须使用lt
,gt
,eq
,ne
,cmp
(运营商各自的等价物前面列出)。可以真正帮助您的示例:
if ("a" == "b") { ... } # This is true.
if ("a" == 0) { ... } # This is also true, for the same reason.
我不需要在outis出色的答案中添加任何内容,我只想为您显示答案即可:
为什么Perl不再经常用于动态网站?是什么使PHP变得比它更受欢迎?
请首先检查一些“工作趋势”网站-您可以独自做出判断。
如您所见,perl仍然是领导者-但对于实际应用而非玩具更可取。:)