Perbedaan antara Perl dan PHP [ditutup]

101

Saya berencana untuk mempelajari Perl 5 dan karena saya hanya menggunakan PHP sampai sekarang, saya ingin tahu sedikit tentang bagaimana bahasa berbeda satu sama lain.

Saat PHP dimulai sebagai satu set "Perl hacks", PHP jelas telah mengkloning beberapa fitur Perls.

  • Apa perbedaan utama dalam sintaks? Apakah benar bahwa dengan Perl Anda memiliki lebih banyak pilihan dan cara untuk mengekspresikan sesuatu?

  • Mengapa Perl tidak lagi sering digunakan untuk situs web dinamis? Apa yang membuat PHP semakin populer?

lok
sumber
2
Karena penasaran, saya harus bertanya: jika Anda dapat dengan bebas memilih bahasa kedua setelah PHP, mengapa Perl daripada menggunakan Python atau Ruby yang lebih modern?
kain pelapis
37
Apa dasar Python dan Ruby menjadi lebih modern?
Joshua Partogi
2
Saya tidak berpikir orang harus mencoba membandingkan bahasa. Itu hanya akan menimbulkan kebingungan.
Ben Shelock
11
@ Ben: membandingkan sintaks memiliki utilitas terbatas. Membandingkan fitur dapat membantu dalam mempelajari bahasa baru.
outis
1
Saya percaya setiap bahasa memiliki kekuatannya berdasarkan apa yang diimpikan oleh para desainer; terutama berdasarkan sekumpulan kasus penggunaan. Oleh karena itu membandingkan bahasa sering kali bias dan membingungkan
CodeAngel

Jawaban:

284

Perl dan PHP lebih berbeda dari yang serupa. Mari kita pertimbangkan Perl 5, karena Perl 6 masih dalam pengembangan. Beberapa perbedaan, secara kasar dikelompokkan berdasarkan subjek:

  • Perl memiliki dukungan ekspresi reguler asli, termasuk literal regexp. PHP menggunakan fungsi regexp Perl sebagai ekstensi.
  • Perl memiliki beberapa operator lagi , termasuk matching ( =~, !~), quote-like ( qw, qx& c.), Exponentiation ( **), string repetition ( x) dan range ( ..and ...). PHP memiliki beberapa operator yang tidak dimiliki Perl, seperti operator penekan kesalahan ( @), instanceof(meskipun Perl memiliki Universal::isametode tersebut) dan clone.
  • Di PHP, newadalah operator. Di Perl, ini adalah nama konvensional dari subrutin pembuatan objek yang didefinisikan dalam paket, tidak ada yang istimewa sejauh menyangkut bahasa.
  • Operator logika Perl mengembalikan argumen mereka, sementara mereka mengembalikan boolean dalam PHP. Mencoba:

    $foo = '' || 'bar';

    dalam setiap bahasa. Di Perl, Anda bahkan dapat melakukan $foo ||= 'default'untuk menyetel $ foo ke nilai jika belum disetel. Cara terpendek untuk melakukan ini di PHP adalah $foo = isset($foo) ? $foo : 'default';(Perbarui, di PHP 7.0+ Anda dapat melakukannya $foo = $foo ?? 'default')

  • Nama variabel Perl menunjukkan tipe bawaan, dimana Perl memiliki tiga, dan penentu tipe adalah bagian dari nama (disebut " sigil "), begitu $foojuga variabel yang berbeda dari @fooatau %foo.
  • (terkait dengan poin sebelumnya) Perl memiliki entri tabel simbol terpisah untuk skalar, array, hashes, kode, pegangan file / direktori, dan format. Masing-masing memiliki namespace sendiri.
  • Perl memberikan akses ke tabel simbol , meskipun memanipulasinya bukan untuk menjadi lemah hati. Dalam PHP, manipulasi tabel simbol terbatas pada pembuatan referensi dan extractfungsi.
  • Perhatikan bahwa "referensi" memiliki arti yang berbeda di PHP dan Perl. Dalam PHP, referensi adalah alias tabel simbol. Di Perl, referensi adalah petunjuk cerdas.
  • Perl memiliki tipe yang berbeda untuk koleksi terindeks integer (array) dan koleksi terindeks string (hashes). Di PHP, mereka memiliki tipe yang sama: array asosiatif / peta terurut .
  • Array Perl tidak jarang: mengatur elemen dengan indeks lebih besar dari ukuran array saat ini akan mengatur semua elemen intervening ke undefined(lihat perldata ). Array PHP jarang; mengatur elemen tidak akan mengatur elemen intervening.
  • Perl mendukung hash dan array slice secara native, dan slice dapat dialihkan, yang memiliki berbagai kegunaan . Di PHP, Anda menggunakan array_sliceuntuk mengekstrak potongan dan array_splicemenetapkan ke potongan.
  • Anda dapat meninggalkan argumen ke operator subskrip di PHP untuk sedikit keajaiban. Di Perl, Anda tidak bisa meninggalkan subskrip.
  • Hash perl tidak diurutkan .
  • Perl memiliki banyak variabel standar dan variabel ajaib . Variabel standar PHP memiliki tujuan yang sangat berbeda.
  • Perl memiliki pengubah pernyataan : beberapa pernyataan kontrol dapat ditempatkan di akhir pernyataan.
  • Perl mendukung pelingkupan dinamis melalui localkata kunci.
  • Selain itu, Perl memiliki cakupan global, lexical (block), dan paket . PHP memiliki cakupan global, fungsi, objek, kelas, dan namespace .
  • Di Perl, variabel bersifat global secara default. Di PHP, variabel dalam fungsi bersifat lokal secara default.
  • Perl mendukung panggilan ekor eksplisit melalui gotofungsi tersebut.
  • Prototipe Perl menyediakan pemeriksaan tipe yang lebih terbatas untuk argumen fungsi daripada petunjuk tipe PHP . Akibatnya, prototipe memiliki kegunaan yang lebih terbatas daripada petunjuk tipe.
  • Di Perl, pernyataan terakhir yang dievaluasi dikembalikan sebagai nilai subrutin jika pernyataan tersebut adalah ekspresi (yaitu memiliki nilai), bahkan jika pernyataan yang dikembalikan tidak digunakan. Jika pernyataan terakhir bukan ekspresi (yaitu tidak memiliki nilai), seperti loop, nilai yang dikembalikan tidak ditentukan (lihat perlsub ). Di PHP, jika tidak ada pengembalian eksplisit, nilai yang dikembalikan adalah NULL .
  • Perl meratakan daftar (lihat perlsub ); untuk struktur data yang tidak diratakan, gunakan referensi.

    @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 tidak meratakan array.

  • Perl memiliki blok kode khusus ( BEGIN, UNITCHECK, CHECK, INITdan END) yang dijalankan. Tidak seperti PHP auto_prepend_filedan auto_append_file, tidak ada batasan jumlah setiap jenis blok kode. Selain itu, blok kode ditentukan di dalam skrip, sedangkan opsi PHP ditetapkan di server dan file konfigurasi per direktori.
  • Di Perl, tanda titik koma memisahkan pernyataan . Dalam PHP, itu menghentikan mereka, kecuali bahwa tag penutup PHP ("?>") Juga dapat menghentikan pernyataan.
  • Nilai ekspresi di Perl peka konteks .
  • Subskrip negatif di Perl relatif terhadap akhir larik. $bam[-1]adalah elemen terakhir dari array. Langganan negatif dalam PHP adalah langganan seperti yang lainnya.
  • Di Perl 5, kelas didasarkan pada paket dan tidak terlihat seperti kelas di PHP (atau kebanyakan bahasa lain). Kelas Perl 6 lebih mirip dengan kelas PHP, tetapi masih sangat berbeda. (Perl 6 berbeda dari Perl 5 dalam banyak hal, tetapi itu di luar topik.) Banyak perbedaan antara Perl 5 dan PHP muncul dari kenyataan bahwa sebagian besar fitur OO tidak terpasang di Perl tetapi berdasarkan peretasan. Misalnya, $obj->method(@args)diterjemahkan ke sesuatu seperti (ref $obj)::method($obj, @args). Daftar tidak lengkap:
    • PHP secara otomatis menyediakan variabel khusus $thisdalam metode. Perl meneruskan referensi ke objek sebagai argumen pertama ke metode.
    • Perl membutuhkan referensi untuk diberkati untuk membuat sebuah objek. Referensi apa pun dapat diberkati sebagai contoh dari kelas tertentu.
    • Di Perl, Anda dapat mengubah pewarisan secara dinamis melalui @ISAvariabel paket .
  • Perl mendukung overloading operator .
  • Sebenarnya, Perl tidak memiliki komentar multiline, tetapi sistem POD dapat digunakan untuk pengaruh yang sama.
  • Di Perl, //adalah operator. Di PHP, ini adalah awal dari komentar satu baris.
  • Hingga PHP 5.3, PHP memiliki dukungan yang buruk untuk fungsi anonim ( create_functionfungsi) dan tidak ada dukungan untuk penutupan.
  • PHP tidak memiliki apa-apa seperti paket Perl sampai versi 5.3, yang memperkenalkan ruang nama .
  • Bisa dibilang, dukungan bawaan Perl untuk pengecualian hampir tidak terlihat seperti pengecualian dalam bahasa lain, begitu banyak sehingga mereka hampir tidak tampak seperti pengecualian. Anda mengevaluasi satu blok dan memeriksa nilai $@( evalbukan try, diebukan throw). The Kesalahan Try :: kecil mendukung modul pengecualian ketika Anda menemukan mereka dalam bahasa lain (serta beberapa modul lain yang tercantum dalam Kesalahan ini Lihat Juga bagian).

PHP terinspirasi oleh Perl sama seperti Phantom of the Paradise terinspirasi oleh Phantom of the Opera , atau Strange Brew terinspirasi oleh Hamlet . Sebaiknya singkirkan perilaku spesifik PHP dari pikiran Anda saat mempelajari Perl, jika tidak, Anda akan tersandung.

Otak saya sakit sekarang, jadi saya akan berhenti.

outis
sumber
21
Ini adalah jawaban yang fantastis, dan saya merasa tidak enak membuat kesalahan kecil di atasnya, tetapi Anda hanya sebagian besar benar tentang array Perl. Saat Anda memiliki @array = qw(a b c)dan melakukannya $array[4] = 'e', konten array tidak persis ('a', 'b', 'c', undef, 'e'); mereka ('a', 'b', 'c', tidak ada , 'e'). Artinya, [3]slot tidak menahan penunjuk ke skalar yang undef; itu tidak memiliki apa-apa (dan existsoperator menguji untuk ini). Perbedaan kecil, tetapi perbedaan. :)
hobbs
9
MAN, ini adalah salah satu jawaban TERBAIK yang pernah saya lihat. Terutama bagian tentang inspirasi. Sederhananya: keren dan BENAR. ;)
jm666
2
Cara terpendek untuk menyiapkan nilai $foojika belum disetel adalahisset($foo) || $foo='default';
alexbusu
45

Ketika PHP muncul, semua orang terkesan dengan perbedaan utama dari Perl:

  1. Variabel input sudah dalam lingkup global, tidak ada penguraian yang membosankan.
  2. Penyematan HTML. Dimana <?php ... ?>saja. Tidak ada template yang membosankan.
  3. Pesan kesalahan di layar. Tidak ada catatan kesalahan yang membosankan.
  4. Mudah untuk dipelajari. Tidak ada membaca buku yang membosankan.

Seiring berjalannya waktu, semua orang mengetahui bahwa mereka tidak menguntungkan, hehe ...

Akal Sehat Anda
sumber
21

Saya telah memperhatikan bahwa sebagian besar halaman PHP vs. Perl tampaknya berasal dari

PHP lebih baik daripada Perl karena <masukkan alasan yang lemah di sini>

sejenisnya, dan jarang membuat perbandingan yang masuk akal.

Dari segi sintaks, Anda akan menemukan PHP seringkali lebih mudah dipahami daripada Perl, terutama bila Anda memiliki sedikit pengalaman. Misalnya, memotong string spasi kosong di depan dan di belakangnya di PHP sangatlah mudah

$string = trim($string);

Di Perl itu agak lebih samar

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

(Saya yakin ini sedikit lebih efisien daripada pengambilan dan penggantian satu baris, dan juga sedikit lebih dapat dimengerti.) Namun, meskipun PHP seringkali lebih mirip bahasa Inggris, kadang-kadang masih menunjukkan akarnya sebagai pembungkus untuk level C rendah, misalnya, strpbrkdan strspnmungkin jarang digunakan, karena sebagian besar pengadu PHP menulis fungsi setara mereka sendiri untuk sesuatu yang terlalu esoteris, daripada menghabiskan waktu menjelajahi manual. Saya juga bertanya-tanya tentang para programmer yang bahasa Inggrisnya adalah bahasa kedua, karena setiap orang sejajar dengan Perl, harus mempelajarinya dari awal.

Saya telah menyebutkan manualnya. PHP memiliki manual online yang bagus, dan sayangnya PHP membutuhkannya. Saya masih merujuknya dari waktu ke waktu untuk hal-hal yang seharusnya sederhana, seperti urutan parameter atau konvensi penamaan fungsi. Dengan Perl, Anda mungkin akan menemukan Anda mengacu pada manual banyak karena Anda memulai dan kemudian suatu hari Anda akan memiliki a-ha saat dan tidak perlu lagi. Setidaknya sampai Anda lebih mahir dan menyadari bahwa tidak hanya ada lebih dari satu cara, mungkin ada cara yang lebih baik, orang lain mungkin telah melakukannya dengan cara yang lebih baik, dan mungkin sebaiknya Anda mengunjungi CPAN saja.

Perl memang memiliki lebih banyak pilihan dan cara untuk mengekspresikan sesuatu. Ini belum tentu merupakan hal yang baik, meskipun memungkinkan kode menjadi lebih mudah dibaca jika digunakan dengan bijak dan setidaknya salah satu cara yang mungkin Anda kenal. Ada beberapa gaya dan idiom yang akan Anda temukan sendiri, dan saya sungguh-sungguh merekomendasikan membaca Perl Best Practices (lebih cepat daripada nanti), bersama dengan Perl Cookbook, Second Edition untuk mendapatkan informasi lebih cepat dalam memecahkan masalah umum.

Saya percaya alasan Perl lebih jarang digunakan di lingkungan shared hosting adalah karena secara historis dianggap kelambatan CGI dan keengganan host untuk menginstal mod_perl karena masalah keamanan dan konfigurasi telah membuat PHP menjadi pilihan yang lebih menarik. Siklus kemudian berlanjut, lebih banyak orang belajar menggunakan PHP karena lebih banyak host menawarkannya, dan lebih banyak host menawarkannya karena itulah yang ingin digunakan orang. Perbedaan kecepatan dan masalah keamanan yang diperdebatkan oleh FastCGI hari ini, dan dalam banyak kasus PHP juga kehabisan FastCGI, daripada membiarkannya di inti server web.

Apakah ini masalahnya atau ada alasan lain, PHP menjadi populer dan segudang aplikasi telah ditulis di dalamnya. Bagi sebagian besar orang yang hanya menginginkan situs web tingkat pemula dengan blog atau galeri foto sederhana, hanya PHP yang mereka butuhkan sehingga itulah yang dipromosikan oleh tuan rumah. Seharusnya tidak ada yang menghentikan Anda untuk menggunakan Perl (atau apapun yang Anda pilih) jika Anda mau.

Di tingkat perusahaan, saya ragu Anda akan menemukan terlalu banyak PHP dalam produksi (dan tolong, tidak ada yang menunjuk Facebook sebagai contoh tandingan, saya katakan tingkat perusahaan ).

Duncan
sumber
2
Untungnya, mendapatkan hosting dengan FastCGI hosting yang memberikan kinerja yang layak tanpa kerumitan mod_perl menjadi lebih mudah.
Quentin
@ David Dorward: Oke. Saya berbicara dalam pengertian historis, karena FastCGI juga memberikan kinerja / keamanan yang lebih baik daripada mod_php. Saya akan mengeditnya untuk mencoba dan membuatnya sedikit lebih jelas.
Duncan
3
Contoh trim Anda tidak masuk akal. Whats lebih baik 4 operator atau mengingat semua parameter yang tidak konsisten dan nilai-nilai pengembalian semua fungsi PHP seperti 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
Myforwik
3
Contoh trim Perl Anda bisa jauh lebih sederhana:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo
1
@ Myforwik, contoh trim saya dimaksudkan untuk menunjukkan bahwa Perl tidak memiliki fungsi yang jelas, yang dapat membingungkan bagi pemula. Setelah Anda mempelajari sintaksnya, ya, itu jauh lebih mudah daripada berurusan dengan semua ketidakkonsistenan - Saya juga menegaskan tentang perlunya manual secara konstan.
Duncan
9

Perl banyak digunakan untuk website, tidak kurang dari Python dan Ruby misalnya. Meskipun demikian, PHP lebih sering digunakan daripada yang lainnya. Menurut saya, faktor terpenting adalah kemudahan penerapan PHP dan kemudahan untuk memulainya.

Perbedaan sintaks terlalu banyak untuk diringkas di sini, tetapi pada umumnya benar bahwa sintaks memiliki lebih banyak cara untuk mengekspresikan diri (ini dikenal sebagai TIMTWOTDI, Ada Lebih dari Satu Cara Untuk Melakukannya).

Leon Timmermans
sumber
9

Hal favorit saya tentang Perl adalah cara menangani array / daftar. Berikut adalah contoh bagaimana Anda akan membuat dan menggunakan fungsi Perl (atau "subrutin"), yang menggunakan ini untuk argumen:

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

Di PHP Anda dapat melakukan hal yang serupa list(), tetapi tidak persis sama; dalam daftar Perl dan array sebenarnya diperlakukan sama (biasanya). Anda juga dapat melakukan hal-hal seperti:

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

Dan perbedaan lain yang HARUS Anda ketahui, adalah operator perbandingan numerik / string. Dalam Perl, jika Anda menggunakan <, >, ==, !=, <=>, dan sebagainya, Perl mengkonversi kedua operan ke nomor. Jika Anda ingin mengkonversi sebagai string sebaliknya, Anda harus menggunakan lt, gt, eq, ne, cmp(yang setara masing-masing operator yang tercantum sebelumnya). Contoh di mana ini benar-benar akan membuat Anda:

if ("a" == "b") { ... } # This is true.
if ("a" == 0) { ... } # This is also true, for the same reason.
crimson_penguin
sumber
Array dan list biasanya diperlakukan sama.
Brad Gilbert
Ya benar. Saya pikir saya akan mengatakan itu, tetapi lupa. Diedit untuk mencerminkan itu.
crimson_penguin
4

Saya tidak perlu menambahkan apa pun pada jawaban luar biasa dari outis, saya hanya ingin menunjukkan jawaban untuk pertanyaan Anda:

Mengapa Perl tidak lagi sering digunakan untuk situs web dinamis? Apa yang membuat PHP mendapatkan popularitas lebih dari itu?

Harap periksa dulu beberapa situs "Tren Pekerjaan" - dan Anda dapat membuat penilaian sendiri.

Seperti yang Anda lihat, perl masih menjadi yang terdepan - tetapi lebih disukai untuk aplikasi nyata, bukan untuk mainan. :)

jm666
sumber
1
Saya pikir perbandingan ini juga menarik: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin Postelnicu
1
Memperbaiki tautan rusak, TOLONG GUNAKAN: simplyhired.com/…
r4.
SH.com/a/jobtrends sepertinya tidak ada. HARAP GUNAKAN: simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.
@ r4. Tautan Anda tidak sama dengan tautan asli (sekarang rusak). Yang asli menunjukkan grafik (seperti di atas), bukan beberapa daftar pekerjaan. Tautan daftar pekerjaan berada di luar cakupan.
jm666