Perl ve PHP arasındaki farklar [kapalı]

6 Cevap php

Perl 5 öğrenmeyi planlıyorum ve ben sadece şimdiye kadar PHP kullanıldığı gibi, ben dilleri birbirinden farklı nasıl hakkında biraz bilmek istiyordu.

PHP "Perl kesmek" bir dizi olarak başladı o besbelli Perls bazı özellikleri klonlanmış oldu.

  • Sözdizimi temel farklar nelerdir? Perl ile size daha fazla seçenek ve bir şeyler ifade etmek yolları var doğru mudur?

  • Perl neden çok sık artık dinamik web siteleri için kullanılmaz? Ne PHP daha fazla popülerlik kazanmak yaptı?

6 Cevap

Perl ve PHP hem daha farklıdır. Perl 6 hala geliştirilme aşamasındadır, çünkü o, Perl 5 düşünelim. Kabaca konuya göre gruplandırılmış bazı farklar:

  • Perl sıradanifade değişmezleri içeren doğal düzenli ifade desteği vardır. PHP bir uzantısı olarak Perl sıradanifade işlevlerini kullanır.
  • Perl epeyce daha fazlası vardır operators, matching (=~, !~), quote-like ({[dahil olmak üzere (5)]}, qx ve c.), exponentiation (**), string repetition ({[(10)] }) ve range (.. ve ...). PHP bu error suppression operator (@), instanceof (though Perl does have the Universal :: isa {[(Perl olarak değil birkaç operatörler var 18)]} .
  • PHP, new is an operator. In Perl, it's the conventional name of an object creation subroutine paketlerde tanımlanmış, kadar dil ile ilgili olarak özel bir şey.
  • Perl mantıksal operatörler kendi argümanlarını dönmek ederken onlar return booleans PHP. Deneyin:

    $foo = '' || 'bar';
    

    Her dilde. Perl, hatta yapabilirsiniz zaten ayarlanmış değilse $foo ||= 'default' bir değere $ foo ayarlamak için. PHP Bunu yapmanın en kısa yolu $foo = isset($foo) ? $foo : 'default'; olduğunu

  • Perl variable names Perl üç sahip olduğu, yerleşik tip işaret ve tipi belirteci ("bir sigil" denir) adının bir parçası, yani {[(2)] } @foo ya da %foo farklı bir değişkendir.
  • (Önceki noktaya bağlı) Perl skalerler, diziler, karma kod, dosya / dizin kolları ve formatları için ayrı symbol table girdileri vardır. Her biri kendi ad vardır.
  • Bunu manipüle cesaretsizlendirmek için olmasa Perl, symbol table erişim sağlar. PHP, sembol tablosu manipülasyon references ve extract işlevi oluşturma ile sınırlıdır.
  • "Referanslar" PHP ve Perl farklı bir anlamı olduğunu unutmayın. PHP, references simge tablosu rumuzlarıdırlar. Perl, references akıllı göstericisidir.
  • Perl tamsayı endeksli koleksiyonlar (diziler) ve dize endeksli koleksiyonlar (sağlamalarının) için farklı tipleri vardır. PHP, onlar aynı tip konum: Bir associative array/ordered map.
  • Perl dizileri seyrek değildir: dizinin geçerli boyutu daha büyük indeksli bir öğe ayarı undefined tüm unsurları müdahale koyacaktır (bkz. perldata). PHP diziler seyrek; Bir öğe ayar elemanlarının müdahale set olmayacaktır.
  • Perl doğal karma ve dizi slices destekler ve dilimleri atanabilir, her türlü sahip olan uses. PHP olarak, array_slice to extract a slice and array_splice Bir dilim atamak için kullanın.
  • Sen sihirli bir bit için PHP argument to the subscript operator dışarı bırakabilirsiniz. Perl'de, simge terk edemez.
  • Perl sağlamalarının vardır unordered.
  • Perl predefined and magic variables büyük bir numarası vardır. PHP'nin predefined variables oldukça farklı bir amacı var.
  • Bazı kontrol deyimleri bir ifadenin sonunda yerleştirilebilir: Perl statement modifiers vardır.
  • local anahtar kelime üzerinden Perl destekleri dynamic scoping.
  • Buna ek olarak, Perl küresel, sözcüksel (blok), ve paket scope. PHP Global, fonksiyon, nesne, sınıf ve ad vardır scope.
  • Perl, değişkenler varsayılan olarak geneldir. PHP, fonksiyonlarda değişkenler varsayılan yerel vardır.
  • Perl goto fonksiyonu ile açık tail calls destekler.
  • Perl prototypes PHP'nin type hinting daha işlev bağımsız değişkenleri için daha sınırlı bir tür denetlemesi sağlamak. Sonuç olarak, prototip tür ipuçlarının daha sınırlı yarar vardır.
  • Deyimi bir ifade (bir değeri vardır yani) ise, Perl, son değerlendirilen deyimi return deyimi kullanılır olmasa bile, bir alt yordam değeri olarak döndürülür. Son açıklama böyle bir döngü gibi bir ifade (yani bir değeri yok), değilse, dönüş değeri belirtilmemiş olan (bkz. perlsub). PHP, hiçbir açık dönüş, return value is NULL varsa.
  • Perl listeleri (perlsub bakınız) düzleştirir; un-basık veri yapıları için başvurular kullanır.

    @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 diziler dümdüz değildir.

  • Perl olan special code blocks (BEGIN, UNITCHECK, CHECK, INIT ve END) O yürütülür. PHP'nin farklı auto_prepend_file and auto_append_file , kod bloğu her tür sayısında bir sınır yoktur. PHP seçenekleri sunucu ve dizin başına yapılandırma dosyalarında ayarlanır oysa Ayrıca, kod blokları, komut içinde tanımlanır.
  • Perl, noktalı virgül separates statements. PHP, bu terminates onları, bir PHP yakın etiketi (">") de bir açıklama durduklarını hariç.
  • Perl ifadelerin değeri context sensitive.
  • Perl Negatif indisler dizinin sonuna göredir. $bam[-1] dizinin son elemanıdır. PHP Negatif indisler başka gibi indisler vardır.
  • In Perl 5, classes are based on packages and look nothing like classes in PHP (or most other languages). Perl 6 classes are closer to PHP classes, but still quite different. (Perl 6 is different from Perl 5 in many other ways, but that's off topic.) Many of the differences between Perl 5 and PHP arise from the fact that most of the OO features are not built-in to Perl but based on hacks. For example, $obj->method(@args) gets translated to something like (ref $obj)::method($obj, @args). Non-exhaustive list:
    • PHP otomatik olarak özel değişkeni $this yöntemleri sağlar. Perl yöntemlere ilk argüman olarak nesnesine bir başvuru geçer.
    • Perl blessed bir nesne oluşturmak için olmak için başvurular gerektirir. Herhangi bir referans belirli bir sınıfın bir örneği olarak kutsanmış olabilir.
    • Perl, dinamik paket @ISA değişkeni üzerinden devralmayı değiştirebilirsiniz.
  • Perl destekleri operator overloading.
  • Açıkçası, Perl satırlı bir yorum yok, ama aynı etkiler için POD sistemi kullanılabilir.
  • Perl, // bir operatördür. PHP, bir tek satır açıklama başlangıç.
  • PHP 5.3 kadar, PHP korkunç anonim fonksiyonları için destek (create_function function) ve kapaklar için hiçbir destek vardı.
  • PHP tanıttı sürüm 5.3 kadar Perl paketleri gibi bir şey vardı namespaces.
  • Onlar pek istisna gibi görünüyor o kadar tartışmasız, Perl yerleşik istisnalar için destek çok diğer dillerde istisnalar gibi hemen hemen hiçbir şey görünüyor. Bir blok değerlendirmek ve $@ değerini kontrol edin (eval yerine try, die instead of throw). Error Try::Tiny modülü diğer dillerde (yanı sıra Error's See Also bölümünde listelenen bazı diğer modüller) onları bulmak gibi durumlar destekler.

PHP Perl ile aynı şekilde Phantom of the Paradise Phantom of the Opera esinlenerek, ya Strange Brew Hamlet esinlenilmiştir esinlenilmiştir. Bu kadar takıldı alırsınız başka, Perl öğrenme zaman aklını PHP davranış özelliklerini koymak en iyisidir.

Beynim acıyor şimdi, ben durdurmak için gidiyorum.

PHP sahneye geldiğinde, herkes Perl temel farklar ile etkilendik:

  1. Zaten küresel kapsamda Girdi değişkenleri, hiç sıkıcı ayrıştırma.
  2. HTML gömme. Sadece <?php ... ?> yerde. Hiç sıkıcı şablonları.
  3. Ekranda hata mesajları. Hiç sıkıcı hata günlüğü peeks.
  4. Kolay öğrenmek için. Hiç sıkıcı kitap okuma.

Zaman geçtikçe, herkes hehe, bir yararı olmadığını öğrendim ...

Ben en çok PHP vs Perl sayfaları olması gibi görünüyor fark ettik

PHP is better than Perl because <insert lame reason here>

ILK ve nadiren makul karşılaştırmalar yapmak.

Sözdizimi-bilge, sen az deneyime sahip, özellikle PHP genellikle Perl daha anlamak daha kolay olduğunu göreceksiniz. Örneğin, önde gelen ve PHP boşluk sondaki bir dize kesme basitçe

$string = trim($string);

Perl bu biraz daha gizlenmiştir

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

(Ben bu biraz tek bir çizgi yakalamak daha verimli ve yerini inanıyorum ve de biraz daha anlaşılır.) Ancak, PHP genellikle daha İngilizce gibi olsa bile, bazen hala düşük seviye C için bir sarıcı olarak kökleri gösterir, Çoğu PHP dabblers yerine kılavuzunu keşfetmek vakit daha çok ezoterik şey için kendi eşdeğer işlevler yazmak, çünkü örneğin, strpbrk ve strspn, muhtemelen nadiren kullanılır. Herkes sıfırdan öğrenmek zorunda, Perl gibi şeyler eşit olduğu gibi ben de, İngilizce bir ikinci dil kimin için programcılar hakkında merak ediyorum.

Zaten manuel belirtmiştik. PHP güzel bir online el kitabı vardır, ve ne yazık ki o ihtiyacı. Ben hala bu tür parametreleri veya fonksiyon adlandırma kuralı sırasına kadar basit olmalıdır şeyler için zaman zaman ona bakın. Perl ile, muhtemelen kılavuzuna başvuruyorsunuz bulacaksınız lot başlamanıza ve sonra bir gün bir a-ha anı olacak ve bir daha asla ihtiyaç olarak. Eh, en azından daha gelişmiş olduğunu ve daha bir yol daha, muhtemelen daha iyi bir yolu var olduğunu değil, sadece o fark kadar, bir başkası muhtemelen daha iyi bir yolu, ve belki de sadece cpan ziyaret gerektiğini bunu yaptı.

Perl does have a lot more options and ways to express things. This is not necessarily a good thing, although it allows code to be more readable if used wisely and at least one of the ways you are likely to be familiar with. There are certain styles and idioms that you will find yourself falling into, and I can heartily recommend reading Perl Best Practices (sooner rather than later), along with Perl Cookbook, Second Edition to get up to speed on solving common problems.

Perl barındırma paylaşılan ortamlarda daha sık kullanılır nedeni PHP daha cazip bir seçenek haline getirmiştir tarihsel CGI ve hosts 'isteksizlik algılanan yavaşlık mod_perl dolayı güvenlik ve yapılandırma konularında yüklemek için olduğuna inanıyorum. Döngüsü daha sonra ana sunmuş ve insanların kullanmak istedim, çünkü daha fazla ana uzattı, çünkü daha fazla kişi PHP kullanmayı öğrendim, devam etti. Yerine web sunucusunun çekirdek bırakarak, gibi daha bir hız farkları ve güvenlik konuları FastCGI bu gün tartışmalı hale, ve çoğu durumda PHP FastCGI tükendi.

Bu durumda ya da başka nedenler vardır olsun ya da olmasın, PHP popüler oldu ve uygulamalar sayısız içinde yazılmıştır. Sadece basit bir blog ya da fotoğraf galerisi ile giriş seviyesi bir web sitesi istiyorum halkın çoğunluğu için, PHP böylece ana teşvik ne de ihtiyaç vardır. Isterseniz Perl (ya da başka bir şey seçtiğiniz) kullanarak sizi durdurma şey olmalıdır.

Kurumsal düzeyde, ben üretimde çok fazla PHP bulmak (ve lütfen, Facebook bir karşı-örnek olarak, dedim enterprise düzeyinde kimse noktası) olacağını sanmıyorum.

Perl, örneğin Python ve Ruby daha az web siteleri için bol bol kullanılır. O dedi, PHP yolu daha sık olanların hepsinden daha kullanılmaktadır. Ben buna en önemli faktörler PHP'nin dağıtım kolaylığı ve onunla başlamak kolaylığı olduğunu düşünüyorum.

Sözdizimi farklar burada özetlemek için çok çoktur, ama genellikle o (bunu yapmak için birden fazla yol var mı, TIMTWOTDI olarak biliyorum) kendinizi ifade etmek için daha çok yolu olduğu doğrudur.

Perl hakkında en sevdiğim şey, diziler / listelerini ele yoludur. Burada yapmak ve argümanlar için bu kullanımı yapan bir Perl fonksiyonu (ya da "yordam"), kullanmak nasıl bir örnek:

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

PHP Eğer list() ile benzer şeyi yapabileceğini, ama oldukça aynı değil; Perl listeleri ve diziler aslında aynı (genellikle) tedavi edilir. Ayrıca gibi şeyler yapabilirsiniz:

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

Ve bilmeniz ZORUNLU başka fark, sayısal / string karşılaştırma operatörleri. Perl olarak, < kullanmak, >, ==, !=, <=>, ve böylece, Perl sayı hem işlenen dönüştürür. Yerine dizeleri olarak dönüştürmek istiyorsanız, lt, gt, eq kullanmak zorunda, ne, {[(9) }] (daha önce listelenen operatörleri ve eşdeğer). Bu gerçekten alacak Örnekler:

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

Ben sadece soru için cevap göstermek istiyorum, outis fantastik cevap için bir şey eklemek gerekmez:

Why is Perl not used for dynamic websites very often anymore? What made PHP gain more popularity than it?

Önce bazı "Job Trends" sitelerini kontrol edin - ve yalnız yargılama yapabilir.

ama oyuncak için gerçek uygulamalar için tercih - Gördüğünüz gibi, perl hala bir liderdir. :)