Perl ve PHP [kapalı] arasındaki farklar


101

Perl 5 öğrenmeyi planlıyorum ve şimdiye kadar sadece PHP kullandığım için, dillerin birbirinden nasıl farklılaştığı hakkında biraz bilgi edinmek istedim.

PHP bir "Perl hackleri" seti olarak başladığından, belli ki Perls özelliklerinden bazılarını klonladı.

  • Söz dizimindeki temel farklılıklar nelerdir? Perl ile bir şeyi ifade etmek için daha fazla seçeneğiniz ve yolunuz olduğu doğru mu?

  • Perl neden artık dinamik web siteleri için çok sık kullanılmıyor? PHP'yi daha popüler hale getiren şey neydi?


2
Merak ediyorum, sormak zorundayım: PHP'den sonra ikinci dilinizi özgürce seçebiliyorsanız, neden daha modern Python veya Ruby yerine Perl?
jholster

37
Python ve Ruby'nin daha modern olmasının temeli nedir?
Joshua Partogi

2
İnsanların dilleri karşılaştırmaya çalışması gerektiğini düşünmüyorum. Sadece kafa karışıklığına yol açacaktır.
Ben Shelock

11
@Ben: sözdizimini karşılaştırmanın sınırlı faydası vardır. Özellikleri karşılaştırmak yeni diller öğrenmeye yardımcı olabilir.
outis

1
Her dilin, tasarımcıların hayal ettiklerine dayanan gücüne sahip olduğuna inanıyorum; özellikle bir dizi kullanım durumuna dayanmaktadır. Bu nedenle, dilleri karşılaştırmak genellikle önyargı ve kafa karıştırıcıdır
CodeAngel

Yanıtlar:


286

Perl ve PHP birbirine benzemekten daha farklıdır. Perl 6 hala geliştirilme aşamasında olduğu için Perl 5'i ele alalım. Konuya göre kabaca gruplandırılan bazı farklılıklar:

  • Perl, regexp değişmezleri dahil olmak üzere yerel düzenli ifade desteğine sahiptir. PHP, bir uzantı olarak Perl'in regexp işlevlerini kullanır.
  • Perl'in eşleme ( , ), alıntı benzeri ( , & c.), Üs alma ( ), dizge tekrarı ( ) ve aralık ( ve ) dahil olmak üzere epeyce daha fazla operatörü vardır . PHP'nin hata bastırma operatörü ( ) gibi Perl'in sahip olmadığı birkaç operatörü vardır (Perl'in yöntemi olmasına rağmen ) ve .=~!~qwqx**x.....@instanceofUniversal::isaclone
  • PHP'de newbir operatördür. Perl'de, paketlerde tanımlanan nesne oluşturma alt yordamının geleneksel adıdır , dil söz konusu olduğunda özel bir şey değildir.
  • Perl mantıksal işleçleri PHP'de booleleri döndürürken argümanlarını döndürür . Deneyin:

    $foo = '' || 'bar';

    her dilde. Perl'de, $foo ||= 'default'önceden ayarlanmamışsa, $ foo'yu bir değere ayarlamak için bile yapabilirsiniz . Bunu PHP'de yapmanın en kısa yolu $foo = isset($foo) ? $foo : 'default';(Güncelleme, PHP 7.0+ sürümünde yapabilirsiniz $foo = $foo ?? 'default')

  • Perl değişken isimleri yerleşik türü gösterir, Perl'de üç tane vardır ve tür belirticisi ismin bir parçasıdır (" sigil " olarak adlandırılır ), yani veya $fooden farklı bir değişken .@foo%foo
  • (önceki nokta ile ilgili) Perl, skalarlar, diziler, karmalar, kod, dosya / dizin tutamaçları ve biçimler için ayrı sembol tablosu girdilerine sahiptir . Her birinin kendi ad alanı vardır.
  • Perl, sembol tablosuna erişim sağlar , ancak onu manipüle etmek kalp zayıflığı için değildir. PHP'de, sembol tablosu manipülasyonu referanslar ve extractişlev oluşturmakla sınırlıdır .
  • "Referanslar" ın PHP ve Perl'de farklı bir anlamı olduğunu unutmayın. PHP'de referanslar , sembol tablosu takma adlarıdır. Perl'de referanslar akıllı işaretçilerdir.
  • Perl, tamsayı dizinli koleksiyonlar (diziler) ve dizge dizinli koleksiyonlar (karmalar) için farklı türlere sahiptir. PHP'de aynı türdendirler: ilişkisel dizi / sıralı harita .
  • Perl dizileri seyrek değildir: dizinin geçerli boyutundan daha büyük indisli bir öğe ayarlamak, araya giren tüm öğeleri olarak ayarlarundefined (bkz. Perldata ). PHP dizileri seyrek; bir öğe ayarlamak, araya giren öğeleri ayarlamaz.
  • Perl, hash ve dizi dilimlerini yerel olarak destekler ve dilimler atanabilir, bu da her türlü kullanıma sahiptir . PHP'de array_slicebir dilimi çıkarmak ve bir dilime array_spliceatamak için kullanırsınız.
  • Biraz sihir için PHP'deki alt simge işlecinin argümanını dışarıda bırakabilirsiniz . Perl'de alt simgeyi dışarıda bırakamazsınız.
  • Perl sağlamaları sırasızdır .
  • Perl'de çok sayıda önceden tanımlanmış ve sihirli değişken vardır . PHP'nin önceden tanımlanmış değişkenlerinin oldukça farklı bir amacı vardır.
  • Perl'in ifade değiştiricileri vardır : bazı kontrol ifadeleri bir ifadenin sonuna yerleştirilebilir.
  • Perl , anahtar kelime aracılığıyla dinamik kapsamı destekler local.
  • Ek olarak, Perl global, sözcüksel (blok) ve paket kapsamına sahiptir . PHP'nin genel, işlev, nesne, sınıf ve ad alanı kapsamı vardır .
  • Perl'de değişkenler varsayılan olarak globaldir. PHP'de, işlevlerdeki değişkenler varsayılan olarak yereldir.
  • Perl , işlev aracılığıyla açık kuyruk çağrılarını destekler goto.
  • Perl'in prototipleri , PHP'nin tür ipuçlarından çok işlev argümanları için daha sınırlı tür denetimi sağlar . Sonuç olarak, prototipler, tür ipucundan daha sınırlı faydaya sahiptir.
  • Perl'de, son değerlendirilen ifade, eğer ifade bir ifade ise (yani bir değeri varsa), bir return ifadesi kullanılmasa bile bir alt yordamın değeri olarak döndürülür. Son ifade, döngü gibi bir ifade değilse (yani bir değeri yoksa), dönüş değeri belirtilmez (bkz. Perlsub ). PHP'de, açık bir dönüş yoksa, dönüş değeri NULL olur .
  • Perl listeleri düzleştirir (bkz. Perlsub ); düzleştirilmemiş veri yapıları için referansları kullanın.

    @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 dizileri düzleştirmez.

  • Perl sahip özel kod bloklarını ( BEGIN, UNITCHECK, CHECK, INITve END) alınmasını sağlamak. PHP'nin aksine auto_prepend_fileve auto_append_file, her tür kod bloğu sayısında bir sınır yoktur. Ayrıca, kod blokları komut dosyaları içinde tanımlanırken, PHP seçenekleri sunucuda ve dizin başına yapılandırma dosyalarında ayarlanır.
  • Perl'de noktalı virgül ifadeleri ayırır . PHP, bu sonlandırır bir PHP yakın etiketi ( "?>") Da bir açıklama son verebileceğini hariç, onları.
  • Perl'deki ifadelerin değeri bağlama duyarlıdır .
  • Perl'deki negatif alt simgeler, dizinin sonuna göredir. $bam[-1]dizinin son öğesidir. PHP'deki negatif abonelikler, diğerleri gibi aboneliklerdir.
  • Perl 5'te, sınıflar paketlere dayalıdır ve PHP'deki (veya diğer birçok dildeki) sınıflara benzemez. Perl 6 sınıfları PHP sınıflarına daha yakındır, ancak yine de oldukça farklıdır. (Perl 6 birçok yönden Perl 5'ten farklıdır , ancak bu konu dışıdır.) Perl 5 ve PHP arasındaki farkların çoğu, OO özelliklerinin çoğunun Perl'de yerleşik değil, hacklere dayalı olmasından kaynaklanmaktadır. Örneğin, $obj->method(@args)gibi bir şeye çevrilir (ref $obj)::method($obj, @args). Kapsamlı olmayan liste:
    • PHP $this, yöntemlerde otomatik olarak özel değişkeni sağlar . Perl, yöntemlere ilk argüman olarak nesneye bir başvuru iletir.
    • Perl, bir nesne oluşturmak için referansların kutsanmasını gerektirir . Herhangi bir referans, belirli bir sınıfın bir örneği olarak kutsanabilir.
    • Perl'de, kalıtımı paketler @ISAdeğişkeni aracılığıyla dinamik olarak değiştirebilirsiniz .
  • Perl, operatörün aşırı yüklenmesini destekler .
  • Kesin olarak söylemek gerekirse, Perl'in çok satırlı yorumları yoktur, ancak POD sistemi aynı etki için kullanılabilir.
  • Perl'de //bir operatördür. PHP'de, tek satırlık bir yorumun başlangıcıdır.
  • PHP 5.3'e kadar PHP, anonim işlevler ( create_functionişlev) için korkunç bir desteğe sahipti ve kapatma desteği yoktu.
  • Ad alanlarını tanıtan 5.3 sürümüne kadar PHP'nin Perl'in paketleri gibi hiçbir şeyi yoktu .
  • Muhtemelen, Perl'in istisnalar için yerleşik desteği, diğer dillerdeki istisnalara neredeyse hiç benzemiyor, öyle ki istisna gibi görünmüyorlar. Bir bloğu değerlendirirsiniz ve değerini $@( evalyerine try, dieyerine throw) kontrol edersiniz . Hata deneyin :: Minik diğer dillerde onları bulmak olarak modül destekleri istisnalar (yanı sıra sıralanan diğer bazı modüller Error adlı Ayrıca Bakınız bölüm).

PHP Perl tarafından aynı şekilde ilham Cennet Phantom esinlenerek Operadaki hayalet veya Strange Brew esinlenerek Hamlet . Perl'i öğrenirken PHP'nin davranış özelliklerini aklınızdan çıkarmak en iyisidir, aksi takdirde takılıp kalırsınız.

Beynim şimdi ağrıyor, bu yüzden duracağım.


21
Bu harika bir cevap ve üzerinde bu kadar küçük bir nitpick yapmaktan dolayı kendimi kötü hissediyorum, ancak Perl dizileri konusunda sadece çoğunlukla haklısınız. Sahip olduğunuzda @array = qw(a b c)ve yaptığınızda $array[4] = 'e', dizinin içeriği tam olarak değildir ('a', 'b', 'c', undef, 'e'); Onlar konum ('a', 'b', 'c', varolmayan , 'e'). Yani [3]yuva, undef olan bir skalere işaretçi tutmaz; hiçbir şey tutmaz (ve existsoperatör bunu test eder). Küçük bir fark, ama bir fark. :)
hobbs

9
ADAM, bu şimdiye kadar gördüğüm EN İYİ cevaplardan biri. Özellikle ilhamla ilgili kısım. Basitçe: havalı ve DOĞRU. ;)
jm666

2
$fooZaten ayarlanmamışsa bir değer oluşturmanın en kısa yolu olabilirisset($foo) || $foo='default';
alexbusu

45

PHP sahneye çıktığında, herkes Perl'den temel farklılıklardan etkilendi:

  1. Girdi değişkenleri zaten genel kapsamda, sıkıcı ayrıştırma yok.
  2. HTML yerleştirme. Sadece <?php ... ?>her yerde. Sıkıcı şablon yok.
  3. Ekrandaki hata mesajları. Sıkıcı hata kaydı yok.
  4. Öğrenmesi kolay. Sıkıcı kitap okumak yok.

Zaman geçtikçe herkes bir fayda olmadığını öğrendi, hehe ...


21

PHP'ye karşı Perl sayfalarının çoğunun,

PHP Perl'den daha iyidir çünkü <buraya lame nedeni ekleyin>

ilkeldir ve nadiren makul karşılaştırmalar yapar.

Sözdizimi açısından, PHP'yi anlamanın Perl'den daha kolay olduğunu göreceksiniz, özellikle de çok az deneyime sahipseniz. Örneğin, PHP'de baştaki ve sondaki boşluklardan oluşan bir dizeyi kesmek basitçe

$string = trim($string);

Perl'de biraz daha şifreli

$string =~ s/^\s+//;
$string =~ s/\s+$//;

(Bunun tek satırlı yakalama ve değiştirmeden biraz daha verimli ve biraz daha anlaşılır olduğuna inanıyorum.) Bununla birlikte, PHP genellikle daha İngilizceye benzese de, bazen köklerini düşük seviye C için bir sarmalayıcı olarak gösterir, örneğin, strpbrkve strspnmuhtemelen nadiren kullanılmaktadır, çünkü PHP uzmanlarının çoğu kılavuzu keşfetmek için zaman harcamak yerine çok ezoterik herhangi bir şey için kendi eşdeğer işlevlerini yazarlar. Herkesin Perl gibi şeylerle eşit düzeyde olduğu, onu sıfırdan öğrenmek zorunda olduğu için İngilizcenin ikinci dil olduğu programcıları da merak ediyorum.

Kılavuzdan daha önce bahsetmiştim. PHP'nin iyi bir çevrimiçi kılavuzu var ve ne yazık ki buna ihtiyacı var. Parametrelerin sırası veya işlev adlandırma kuralı gibi basit olması gereken şeyler için yine de zaman zaman ona başvuruyorum. Perl ile, muhtemelen manuel bir başvuruyorsunuz bulacaksınız çok başlangıçtan itibaren ve daha sonra bir gün olacak bir a-ha anı ve tekrar gerek kalmaz. Pekala, en azından daha ileri seviyeye gelene ve sadece birden fazla yolun olmadığını, muhtemelen daha iyi bir yolun olduğunu, muhtemelen başka birinin bunu daha iyi yaptığını anlayana kadar ve belki de CPAN'ı ziyaret etmelisiniz.

Perl'in bir şeyleri ifade etmek için çok daha fazla seçeneği ve yolu var. Bu, kodun akıllıca kullanıldığında daha okunaklı olmasına ve aşina olabileceğiniz yollardan en az birine izin vermesine rağmen, illa ki iyi bir şey değildir. Kendinizi içine düştüğünüz belli stil ve deyimler vardır ve sık karşılaşılan sorunları çözme konusunda hız kazanmak için Perl En İyi Uygulamaları (er ya da geç) ile birlikte Perl Yemek Kitabı, İkinci Baskı'yı okumanızı yürekten tavsiye edebilirim .

Perl'in paylaşılan barındırma ortamlarında daha az kullanılmasının nedeninin, tarihsel olarak CGI'nin algılanan yavaşlığı ve ana bilgisayarların güvenlik ve yapılandırma sorunları nedeniyle mod_perl'i yükleme konusundaki isteksizliğinin PHP'yi daha çekici bir seçenek haline getirdiğine inanıyorum . Döngü daha sonra devam etti, daha fazla kişi PHP'yi kullanmayı öğrendi çünkü daha fazla ana bilgisayar sundu ve daha fazla ana bilgisayar bunu sundu çünkü insanların kullanmak istediği buydu. Hız farklılıkları ve güvenlik sorunları bu günlerde FastCGI tarafından tartışılıyor ve çoğu durumda PHP, web sunucusunun çekirdeğinde bırakmak yerine FastCGI'nin dışında kalıyor.

Durum böyle olsun ya da olmasın ya da başka nedenler var, PHP popüler oldu ve içinde sayısız uygulama yazıldı. Basit bir bloga veya fotoğraf galerisine sahip giriş düzeyinde bir web sitesi isteyen çoğu insan için, ihtiyaç duydukları tek şey PHP'dir, bu nedenle ev sahiplerinin teşvik ettiği şey budur. İsterseniz sizi Perl (veya seçtiğiniz herhangi bir şey) kullanmaktan alıkoyan hiçbir şey olmamalıdır.

Kurumsal düzeyde, üretimde çok fazla PHP bulacağınızdan kuşkuluyum (ve lütfen, Facebook'ta bir karşı-örnek olarak hiç kimse , kurumsal düzeyde dedim ).


2
Ne mutlu ki, mod_perl'in komplikasyonları olmadan iyi performans sağlayan FastCGI hosting ile hosting almak daha kolay hale geliyor.
Quentin

@David Dorward: Tamam. Tarihsel anlamda konuşuyordum çünkü FastCGI mod_php'den daha iyi performans / güvenlik sağlıyor. Bunu biraz daha net hale getirmek için düzenleyeceğim.
Duncan

3
Kırpma örneğiniz mantıklı değil. Yenilikler iyi 4 operatörler ya da Ereg ereg_replace eregi eregi_replace mb_ereg mb_ereg_replace mb_eregi mb_eregi_replace preg_match preg_match_all preg_replace str_replace str_ireplace strstr stristr strrchr strpos stripos strrpos strripos mb_strpos mb_strrpos olarak tüm PHP fonksiyonlarının tutarsız parametreleri ve dönüş tüm değerleri hatırlayarak
Myforwik

3
Perl trim örneğiniz çok daha basit olabilir:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo

1
@ Myforwik, benim trim örneğim Perl'in yeni başlayanlar için kafa karıştırıcı olabilecek bariz işlevlere sahip olmadığını göstermeyi amaçlıyordu. Sözdizimini öğrendikten sonra, evet, tüm tutarsızlıklarla uğraşmaktan çok daha kolaydır - ayrıca bu noktaya sürekli olarak el kitabına ihtiyaç duymakla da değindim.
Duncan

9

Perl, web siteleri için bol miktarda kullanılır, örneğin Python ve Ruby'den daha az değildir. Bununla birlikte, PHP tüm bunlardan çok daha sık kullanılır. Bence bundaki en önemli faktörler PHP'nin dağıtım kolaylığı ve onunla başlama kolaylığı.

Sözdizimindeki farklılıklar burada özetlenemeyecek kadar çoktur, ancak genellikle kendinizi ifade etmenin daha fazla yolu olduğu doğrudur (bu TIMTWOTDI olarak bilinir, Yapmanın Birden Fazla Yolu Var).


9

Perl ile ilgili en sevdiğim şey, dizileri / listeleri işleme biçimi. İşte argümanlar için bundan yararlanan bir Perl işlevini (veya "alt yordamı") nasıl yapıp kullanacağınıza dair bir örnek:

sub multiply
{
    my ($arg1, $arg2) = @_; # @_ is the array of arguments
    return $arg1 * $arg2;
}

PHP'de ile benzer bir şey yapabilirsiniz list(), ancak bu tamamen aynı değildir; Perl'de listeler ve diziler aslında aynı şekilde ele alınır (genellikle). Ayrıca aşağıdaki gibi şeyler de yapabilirsiniz:

$week_day_name = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")[$week_day_index];

Bilmeniz GEREKEN başka bir fark da sayısal / dizge karşılaştırma operatörleri. Eğer kullanırsanız Perl yılında <, >, ==, !=, <=>, vb, Perl numaralara hem işlenen dönüştürür. Bunun yerine dizeleri olarak dönüştürmek istiyorsanız, kullanımına sahip lt, gt, eq, ne, cmp(operatörlerin ilgili eşdeğerleri yukarıda listelenen). Bunun sizi gerçekten getireceği örnekler:

if ("a" == "b") { ... } # This is true.
if ("a" == 0) { ... } # This is also true, for the same reason.

Diziler ve listeler genellikle aynı şekilde ele alınır.
Brad Gilbert

Evet doğru. Sanırım bunu söyleyecektim ama unuttum. Bunu yansıtmak için düzenlendi.
crimson_penguin

4

Outis'in harika cevabına herhangi bir şey eklemem gerekmiyor, sorusuna sadece cevabını göstermek istiyorum:

Perl neden artık dinamik web siteleri için çok sık kullanılmıyor? PHP'nin ondan daha popüler olmasını sağlayan nedir?

Lütfen önce bazı "İş Trendleri" sitelerini kontrol edin - yargıyı tek başına yapabilirsiniz.

Gördüğünüz gibi, perl hala bir liderdir - ancak oyuncaklar için değil gerçek uygulamalar için tercih edilir. :)


1
Bu karşılaştırmanın da ilginç olduğunu düşünüyorum: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin

1
Bozuk bağlantı düzeltildi, LÜTFEN KULLANIN: Simplyhired.com/…
r4.

SH.com/a/jobtrends yok gibi görünüyor. LÜTFEN KULLANIN: Simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.

@ r4. bağlantılarınız orijinal (artık bozuk) bağlantıyla aynı değil. Orijinal, bazı iş listelerini değil , bir grafiği (yukarıdaki gibi) gösterir . İş listeleme bağlantıları kapsam dışındadır.
jm666
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.