敢問 Perl 比 Python 好在哪裡?
1. perl正則好用: sed, awk, grep的正則有細微差異, 難以記憶, 基本上一個正則表達式需要試很久. 而perl在onelinar寫shell腳本中, 可以替換sed/awk/grep. 只需要記住統一的perl正則即可, 統一簡潔好用.
2. 形式自由, 可以隨心所欲. 用perl寫腳本, 可以有多種寫法. 想簡潔就簡潔, 想整潔就整潔, 風格自己定.
3. 繁雜的extension和精簡的語言內核很吸引人. 函數(sub)和符號表(%::)都是first-citizen, 所以高階函數和typeglob都用起來很爽.
4. 最最重要原因, 用perl的人, 內心強烈的認為perl比python好, 不用不知道這種偏好是多麼強烈. 偏好是一種強烈的執念, 執念容易虛妄.
5. 其實ruby要比perl和python都好. 但腳本語言, 屬於小語種, 熟悉了常用的一種, 就不想學其他小語種了.
謝 @KE meng邀。不過Python這東西我不熟,所以不太好說太細節的比較。
從我對Python的少量了解來看,Perl大概有這麼幾個優勢:
- 性能稍微好一點,不過十分不顯著。而且Perl的Moose對象系統會造成10%左右的性能損失。如果你用Perl構建比較複雜的系統,使用了Moose,那對Python的性能優勢應當會被抹回去。
- Perl的靈活程度據說比Python要高。
- Python用縮進代替花括弧作為代碼段的標識,有時很坑爹。Perl那種類C的語法會比較容易掌握,也更不容易出錯。
不過,其實Perl有幾個頗為顯著的缺陷:
- 它的內置功能變數使用單字元名,比如$_、$?、$!、$0、$、$^等等,不利於新手記憶。
- Perl的C API非常之坑爹,它是一大坨由宏、自製語言和代碼生成器組成的不可名狀之物,封裝混亂(看起來像是把Perl interpreter內部使用的東西塞給你),文檔模糊不清,而且會把干一件事情的邏輯分散在幾個離得很遠的文件里。我花了很多精力在文檔、論壇、博客裡面,才弄明白這套玩意的工作邏輯。與之相比,Python的C API我雖然只是大致看過一下,但看起來更符合正常人對一個API的期望。
- Perl的模塊數量更多,但質量有點坑爹,充分體現了「卧槽這個輪子好爛,看我來造個更爛的」。特別是圖表繪製的模塊,得有七八個,但就沒一個特別好用的。
======想到啥就補充上=====
Perl的變數有個特點,帶標識前綴。這樣語言就可以設計為允許直接嵌入字元串表達式。比如:
my $value = 123;
say "value is $value";
要是Python,那就必須format:
value = 123
# 舊式的
print "value is %d" % (value)
# 新式的
print "value is {}".format(value)
前者比較清晰。同時,如果需要精細控制,Perl有同樣的能力:
my $value = 123;
say sprintf "value is %d", $value;
==== 繼續補充 ====
Perl的正則是「嵌入」到語言里的,為正則設計了專門的關鍵字、操作符、變數,敲起來會比使用名字空間里的東西更快。比如
my $var = "deep_dark_fantasy";
if ($var =~ /(.*)_dark_(.*)/)
{
# 會得到 "my name is Van: deep dark fantasy"
say "my name is Van: $1 dark $2";
}
Perl原生的對象系統是裸奔的:實質上只提供了動態語言最基本的對象概念,將數據綁定到名字空間里,名字空間中的函數就是對象方法。不過Moose系統提供了比較高級的成員、變數、構造器語義:
package PhilosophyGladiator;
use Moose;
has "name" =&> (
is =&> "ro", # 只讀屬性
isa =&> "Str", # 運行時類型檢查,是字元串
default =&> "Van", # 默認值
);
sub self_describe
{
my $self = shift;
print "my name is ", $self-&>name, ".
";
print "I"m an artist, a performance artist
" if $self-&>name eq "Van";
}
perl在eda 電路設計中是典型的膠水語言,就這個應用場景下說說相對於python的體驗1 正則很強大,處理字元串異常順手2 perl的基本語法和函數就能完成大量工作,不用像python一樣要想那個功能在哪個package里3 與linux unix集成的特別好。用perl配置參數,調用命令或者compile好的C,然後從文本中分析結果,這套流程不是一般的順4 perl的數據結構非常靈活,hash相當方便5 perl不是強類型,所以各種轉換極為靈活6 用了perl one line 之後,sed和awk都不用了7 這套流程成熟在python流行之前,路徑依賴很重要
lambda可以寫多行,函數式可以玩出好多花樣
如果打$同時能有馬里奧吃金幣的音效那就high了
繼承Perl衣缽的PHP成為了編程第一語言,就憑這點,Python目前還比不了。
perl到6了,python還在3。而且唐鳳很有特色。
剛才看到有幾個答案拿sigil來抖機靈的,也是醉了。這要是在HN上,估計早被踩得看不出來了。
這裡就sigil補充幾句。sigil主要有兩個優點,一是有助於識別變數類型(沒有sigil的話就要在變數名上做文章來提高可讀性),二是可以愉快地玩耍string interpolation。對於習慣了sigil的人來說這就是一個比python強的點。如果我這麼說你還是嫌sigil影響了你的輸入或者閱讀效率呢,出門左拐上cpan找一個叫bare的模塊去。
說到sigil又想到另一個東西:context。一個方法可以根據不同的context返回不同的結果,典型的用途就是做lazy/eager evaluatuon,比如讀文件,在scalar context下讀一行出來,在list context下讀全文至一個array。這個功能也是大多數語言沒有的。
下面是2015年7月寫的原答案:
1. Perl的正則表達式很強,可以說是常見通用編程語言中最強的。如果做文本處理的話,大多數應用場合Perl比其它語言要方便。在電子/半導體行業的不少技術崗位上會Perl幾乎是必須技能。
2. 我沒有比較過CPAN上的module覆蓋領域與Python比如何,但至少在SA/DBA這塊是Perl比較強3. 在軟體測試領域,Perl用的比較多。TAP最早就是在Perl上搞出來的。4. Perl和Python表面上可能差別不小,實則語言功能上非常相似,不考慮一些特殊領域的module availability的情況下,在其中之一上可以實現的東西在另一個上往往可以用很類似的辦法實現。但是Perl比Python有更多容易坑初學者的東西,所以熟悉Perl的人學Python會很容易,反之則未必。有時候我覺得傳統動態語言(Perl/Python/Ruby)的市場份額在未來很難有高增長。近年來如Java, C++這些處於性能第一梯隊的傳統的企業級編程語言也在不斷演化並借鑒動態語言的功能。目前看Perl6有很大的潛質,但如果它最終在市場上不能成功的話,Perl會在未來一二十年里慢慢死去,淪為個別領域內的專用語言。Python目前勢頭很強,但在上面這個大前提下,從長期看恐怕也難有特別大的作為。Perl寫的代碼大部分是「write only」的,不具備可維護性,這樣就能間接提高這段Perl代碼編寫者的不可替代性。
Perl 在1999 年的那場血戰當中保護了地球。
然後活下來的人才有機會把Python 改進到終於可用的程度。
對老年人,要學會尊重。我用perl寫了一個3000行的框架,運行良好,很少出Bug。但我們老闆讓我以後盡量用python...
可我還是固執地不想用Python, 用了一段時間,被「強行」縮進這個特性噁心到了!
求教怎麼打$這個符號快一點 要買個腳踏板嗎
不知道,不過我有時候會糾結一下用python還是bash最後選擇了後者然後不得不在維護過程里依次加入sed, awk等外部命令,最後得到了一個Perl的糟糕替代品
python 的理念是『There is only one way to do it.』,然而它還是有2、3兩個不兼容的版本,還是有 pip 和 easy_install 兩個各有千秋的包管理器,http 庫有官方自帶的,但還是第三方的『Requests: HTTP for Humens』更好用。
反觀 perl,標榜著『There"s more than one way to do it.』,CPAN 上的『LWP』這個大而全的第三方 http 模塊,無人不曉,但也有其它的第三方 http 模塊,諸如曾經進入過 perl 官方模塊的『HTTP::Tiny』、跟『Mojolicious』一起發布的『Mojo::UserAgent』等等;在面向對象方面,perl 本身的支持很弱雞,現在是靠著 CPAN 上面的第三方模塊『Moose』來提供完整的面向對象支持,當然,你沒有用到『Moose』中的高級特性的話,也可以考慮使用運行更快的精簡版本『Moo』;perl 本身自帶了很多語法糖,所以,它也被戲稱為『write-only language』,例如:
while ( defined( my $line = &<&> ) ) {
print $line;
}
可以簡寫為:
while (&<&>) {
ptint;
}
或者:
print while (&<&>);
有時候也會寫出讓人困擾的代碼,所以,在團隊合作的時候,一般都盡量避免使用 $_ 這個內置變數,而使用自己命名的變數。
python 里的『Ctypes』模塊比較好用,perl 里要實現類似的功能只能動用 XS 了(
正則表達式方便:
$string=~s/red/blue/g;hash(c++里是map)使用方便:構建多層hash$h{$school}{$grade}{$class}{$name}{$course}=$score;使用多層hash
foreach my $school(keys %h){ foreach my $grade(keys %{$h{$school}}){...}
}寫起來簡單點這個沒得比,駱駝肯定比蟒蛇值錢的多。
來點正經的:文本處理,正則表達式相比Python有優勢。其他不敢妄下評論。
我記得小駱駝的開篇有這麼一句話「Perl適合處理90%的文本加上10%其他數據的問題」。所以說對付大批量的文本數據還是Perl更靠譜一些。學生物信息的人必會Perl很大一部分原因也就在此,僅就測序而言,你需要的幾乎所有數據統統都是文本文件。至於說語法靈活的可以省省了。就那必不可少的$在我初學的時候就給我製造過無數的麻煩。寫代碼不是為了炫技,能保證你最快速寫出高質量,高可讀性的程序的語法才是好語法,很顯然這點Perl不是。
用過一年多Perl,現在要學Python,大概了解了下, 感覺暫時還是Perl看著舒服,起碼程序塊Perl是{},Python喜歡縮進有點不太適應~淺顯的理解他們兩個的區別:Perl適合文本數據處理,Python適合複雜面向對象開發和數據分析。僅此個人淺顯理解。。
簡明 Python 教程
裡面提到過
"我感到Perl唯一也是十分重要的優勢是它龐大的CPAN庫——綜合Perl存檔網路。就如同這個名字所指的意思一樣,這是一個巨大的Perl模塊集,它大得讓人難以置信——你幾乎用這些模塊在計算機上做任何事情。Perl的模塊比Python多的原因之一是Perl擁有更加悠久的歷史。或許我會在comp.lang.python上建議把Perl模塊移植到Python上的計劃。"@菲爾摩斯 謝邀現在在用mason。。web方面應該沒有優勢
推薦閱讀:
※為什麼腳本語言GC使用了引用計數法?
※對於學自然語言處理方向的學生來說,學 Perl 好還是學 Python 好?理由是什麼?
※學習perl兩個月感覺還是什麼都不會,怎麼辦?
※如何用python實現行列互換?
※Perl、PHP、Python、Ruby對於入門的Linux運維來說,哪個更易學?