Perl中的编程风格


9

我使用Java工作,因此基本上我在编码过程中使用OOP范例。我即将开始在Perl中工作,我想知道Perl开发人员遵循的范式是什么。在Wiki中,它提到它支持许多范例,但是由于它是一种脚本语言,因此我不确定我是否理解这一点。

所以我的问题是:是Perl中Java惯用语言中我熟悉的面向对象模式,还是我需要对设计风格进行重大更改才能编写有效的Perl?

注意:这不是批评Perl的问题。我实际上必须在Perl中工作,并且想了解我编程的当前方式将如何改变。


3
更严重的是,在Google搜索“ perl哲学”,然后在这里查看:perldesignpatterns.com
Robert Harvey

Perl支持OOP。您可以构建实现虚拟功能等的类层次结构。这不是最常见的用法,但是可以做到。
马丁·约克

“因为它是一种脚本语言”-可以这样使用,但是请记住,perl与Java一样是VM-perl会(即时)编译为字节码,然后执行。没有JIT,但除此之外,它仍然是运行代码的虚拟机。
Tanktalus

Answers:


15

Perl的哲学倾向是“现在做些实际的事情”。如果您需要使用OOP,请在此处使用。并不是所有的解决方案都需要强迫一个人编写OOP代码,而这只是一个简单的“先做然后先做然后再做”的类型问题,通常会适得其反。

Perl的多范式性质可以从诸如Schwartzian转换之类的东西中看到,它具有非常实用的功能(在Lisp中,它被称为“装饰-排序-未装饰”)。OOP存在,程序性(C式编程)和命令式(bash式如“先执行此操作”)也存在。

设计模式是常见问题的常见解决方案。它们以每种语言存在。有时这些模式称为成语,尽管这也可能指比模式简单得多的事物。

必要时,可以在perl中实现许多经典的GOF设计模式。 Perl设计模式将具有许多熟悉GOF的通用名称。不必全部都是惯用的perl。

在perl中探索设计模式时,也请注意Mark Dominus所著的“ Design Patterns”

许多人认为设计模式是该语言的缺陷。从这个角度来看,Perl中通常不需要诸如迭代器之类的设计模式。不总是-但经常。

首先,编写惯用的perl。不要尝试用perl编写C或用perl编写lisp或用perl编写Java。Perl是perl。如果存在的问题超出了perl所能解决的范围,并且您开始需要更复杂的类结构,请编写它们。知道设计模式就能识别“这个问题已经发展到需要抽象工厂的地步了”-但是,如果您不需要一个抽象工厂,请不要尝试在perl中创建一个抽象工厂。

一些库以OOP和更传统的形式存在。请参阅我应该使用面向功能的还是面向对象的CGI接口?对于一个古老的SO问题,其中有人问使用该库的方式。


4
+1。有趣的信息。考虑到所有这些因素,SO中为什么有很多帖子试图捍卫/攻击Perl作为一门老语言?对我来说似乎强大而有用。
user10326 2013年

2
每个人都有自己喜欢的语言。许多人认为,除非一种语言能够支持“本周的新事物”,否则该语言将过时且过时,应将所有内容从中删除。其他人则投入了大量时间来学习一种特定的语言,并且知道如何使其在实际的地方工作。可以轻松地将其更改为任何跟不上热门新语言的语言。当获得Perl 6所需的时间(任何一天……现在……一年!)时,Perl都遭受了特别的剥夺权利。这不应该阻止学习perl,它在许多地方都得到了使用。

1
您可能会发现perl是linux脚本编写的通用语言,从古至今,shell脚本一直扮演着许多角色。在* nix系统上进行脚本编写时,如果编写Perl脚本而不是bash,则只有最坚决的Shell脚本编写者才会抱怨。对于perl来说,最重要的事情之一是CPAN-如果要进行编写大小合适的库,只需检查是否有人已经编写过。

1
曾经是某种程度或更复杂的shell脚本的任何东西现在通常都是perl脚本。Perl通常还充当系统或应用程序之间的胶水/胶带。它的字符串处理也使它在其他几个行业中脱颖而出(尤其是生物信息学-请看看SO的perl标签中存在多少基于DNA的问题)。

4
Perl是一种健壮且完整的编程语言。它可以用于脚本编写(与包括外壳程序在内的其他应用程序自动交互),也可以用于构建实用程序,甚至用于大型应用程序。对Perl的仇恨往往集中在诸如其密集语法之类的东西上,并且在某种程度上还误解了Perl并未试图向其用户强加特定设计模式这一事实。我每天都使用Perl。我也经常使用其他语言。我喜欢Perl的表现力和力量。摆脱笨拙的学习阶段,您也很可能会喜欢它。
DavidO 2013年

7

Perl对范式的立场是TMTOWTDI(有多种方法可以做到)。这就是很多人开玩笑地称Perl为只写语言的原因之一。编写它比阅读它要容易得多,因为另一个人的风格可能与您完全不同。

话虽如此,Perl肯定支持OOP。如果您使用大量的第三方代码,则可能是OOP,也可能不是OOP,但是对于您自己的代码,您可以对自己的内容进行OOP。我实际上是首先在Perl学习OOP的。我先尝试了C ++,由于某种原因它没有“单击”。


1
为什么很多人认为这是一个不好的职业选择?它似乎功能强大,可以作为工具集的一部分与其他语言互补。
user10326

3
假设其他语言几乎一样强大,并且具有更多固有的结构。公司喜欢结构。
Karl Bielefeldt


1
那是一个很好的OOP教程,解释了Perl的内置OO风格。如果您发现该代码有点冗长,您可能会对Perl库Moose感兴趣,该库可自动执行内置OO中的许多重复编码。但是最好从内置样式开始(IMH0)。
马特·弗雷克(Matt freake),2013年

1
我从未发现Perl是一个糟糕的职业选择。找到一个本地的Perl Mongers小组,很有可能在几乎每次会议上都会有人提到Perl的职位空缺。
DavidO 2013年

3

我处在相同的情况下,我一直在使用Java一段时间,

迁移到Perl让人感到震惊和松了一口气,但是我使用了一本书,叫做《 Perl Best Practices》。它很有帮助,如果您了解编程语言的基本概念,那么就很容易理解。

只需记住,使用perl的方法不止一种,我花了无数小时来查看某些代码并对其进行修改,但最终它完成了工作,并产生了简单的语法错误。


0

在Perl中有多种处理代码重用的方法。许多示例并未明确说明方法之间的区别,许多类至少使用两种方法。

我建议尽可能使用OO样式,并且仅在至少三个或更多类需要相对较小的实用程序功能类时才使用EXPORTER。

所以:

package Foo; 
use Foo::Util qw(util) ;
use strict ; 

sub foo {
}

sub bar {
}

1; 

package Foo::Bar ;
use Foo ; 
use Foo::Util qw(util) ;
our @ISA = qw(Foo) ; 
use strict ; 

sub bar {
}

1; 

package Foo::Util ; 
use Exporter ; 
our @ISA = qw(Exporter) ; 
our @EXPORT = qw(util) ;
use strict ; 

sub util {
}

1;

我更喜欢将OO方法和该EXPORTER方法可视化为代码可用性的两个不同维度,就像函数从x或y轴进入当前程序包一样。

在上面的示例中:

Foo::Barfoo()从类派生方法Foo

Foo::Bar定义了一个bar()方法,因此多态方法bar()不是从类派生的Foo

这两个类FooFoo::Bar接收EXPORTED功能(未方法util()从包装(未类Foo::Util

这两个系统看起来很复杂,但是具有非常实用的实用性。跟踪多重继承会很快变得棘手。因此,具有代码可用性的第二个维度,可以使您的继承树保持较小且易于管理。

通常,如果函数是整体的且相对笨拙,请使用EXPORTER,否则请使用继承。但是EXPORTER,除非您打算做的事可能涉及3个或4个以上的软件包,否则不要打扰使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.