Sự khác biệt giữa Perl và PHP [đã đóng]


101

Tôi đang lên kế hoạch học Perl 5 và vì tôi chỉ mới sử dụng PHP cho đến bây giờ, tôi muốn biết một chút về sự khác biệt của các ngôn ngữ với nhau.

Vì PHP bắt đầu như một tập hợp các "Perl hacks", rõ ràng là nó đã sao chép một số tính năng của Perls.

  • Sự khác biệt chính trong cú pháp là gì? Có đúng là với Perl bạn có nhiều lựa chọn và cách thức để thể hiện điều gì đó không?

  • Tại sao Perl không được sử dụng cho các trang web động thường xuyên nữa? Điều gì đã khiến PHP trở nên phổ biến hơn?


2
Tò mò, tôi phải hỏi: nếu bạn có thể tự do chọn ngôn ngữ thứ hai của mình sau PHP, tại sao Perl thay vì Python hoặc Ruby hiện đại hơn?
jholster

37
Cơ sở nào để Python và Ruby trở nên hiện đại hơn?
Joshua Partogi

2
Tôi không nghĩ mọi người nên thử so sánh các ngôn ngữ. Nó sẽ chỉ dẫn đến sự nhầm lẫn.
Ben Shelock

11
@Ben: so sánh cú pháp có tiện ích hạn chế. So sánh các tính năng có thể giúp ích trong việc học ngôn ngữ mới.
outis

1
Tôi tin rằng mọi ngôn ngữ đều có thế mạnh dựa trên những gì các nhà thiết kế đã hình dung cho nó; đặc biệt là dựa trên một tập hợp các trường hợp sử dụng. Do đó so sánh ngôn ngữ thường được thiên vị và khó hiểu
CodeAngel

Câu trả lời:


284

Perl và PHP khác nhau nhiều hơn là giống nhau. Hãy xem xét Perl 5, vì Perl 6 vẫn đang được phát triển. Một số khác biệt, được nhóm lại theo chủ đề:

  • Perl có hỗ trợ biểu thức chính quy gốc, bao gồm cả các ký tự regexp. PHP sử dụng các hàm regexp của Perl như một phần mở rộng.
  • Perl có khá hơn một vài nhà khai thác , trong đó có phù hợp ( =~, !~), trích dẫn như ( qw, qx& c.), Lũy thừa ( **), chuỗi lặp lại ( x) và phạm vi ( .....). PHP có một vài toán tử mà Perl không có, chẳng hạn như toán tử triệt lỗi ( @), instanceof(mặc dù Perl có Universal::isaphương thức này) và clone.
  • Trong PHP, newlà một toán tử. Trong Perl, đó là tên thông thường của một chương trình con tạo đối tượng được định nghĩa trong các gói, không có gì đặc biệt về ngôn ngữ.
  • Các toán tử logic Perl trả về các đối số của chúng, trong khi chúng trả về các boolean trong PHP. Thử:

    $foo = '' || 'bar';

    trong mỗi ngôn ngữ. Trong Perl, bạn thậm chí có thể làm $foo ||= 'default'để đặt $ foo thành một giá trị nếu nó chưa được đặt. Cách ngắn nhất để làm điều này trong PHP là $foo = isset($foo) ? $foo : 'default';(Cập nhật, bạn có thể làm trong PHP 7.0+ $foo = $foo ?? 'default')

  • Các tên biến Perl chỉ ra kiểu tích hợp, trong đó Perl có ba và định nghĩa kiểu là một phần của tên (được gọi là " sigil "), vì vậy $foomột biến khác với @foohoặc %foo.
  • (liên quan đến điểm trước) Perl có các mục nhập bảng ký hiệu riêng biệt cho vô hướng, mảng, băm, mã, xử lý tệp / thư mục và định dạng. Mỗi tên đều có không gian tên riêng.
  • Perl cho phép truy cập vào bảng biểu tượng , mặc dù thao tác này không dành cho những người yếu tim. Trong PHP, thao tác trên bảng biểu tượng được giới hạn trong việc tạo tham chiếuextracthàm.
  • Lưu ý rằng "tham chiếu" có nghĩa khác trong PHP và Perl. Trong PHP, tham chiếu là bí danh bảng ký hiệu. Trong Perl, các tham chiếu là những con trỏ thông minh.
  • Perl có các kiểu khác nhau cho các bộ sưu tập được lập chỉ mục số nguyên (mảng) và các bộ sưu tập được lập chỉ mục chuỗi (hàm băm). Trong PHP, chúng cùng kiểu: một mảng kết hợp / bản đồ có thứ tự .
  • Mảng perl không thưa thớt: việc đặt một phần tử có chỉ mục lớn hơn kích thước hiện tại của mảng sẽ đặt tất cả các phần tử xen vào thành undefined(xem dữ liệu perldata ). Các mảng PHP thưa thớt; thiết lập một phần tử sẽ không thiết lập các phần tử can thiệp.
  • Perl hỗ trợ băm và các lát mảng nguyên bản, và các lát cắt có thể gán được, có tất cả các loại sử dụng . Trong PHP, bạn sử dụng array_sliceđể trích xuất một lát cắt và array_splicegán cho một lát cắt.
  • Bạn có thể bỏ qua đối số cho toán tử chỉ số con trong PHP để có một chút kỳ diệu. Trong Perl, bạn không thể bỏ qua chỉ số phụ.
  • Hàm băm Perl không có thứ tự .
  • Perl có một số lượng lớn các biến số ma thuật và được xác định trước . Các biến được xác định trước của PHP có một mục đích khác.
  • Perl có các bổ ngữ câu lệnh : một số câu lệnh điều khiển có thể được đặt ở cuối câu lệnh.
  • Perl hỗ trợ xác định phạm vi động thông qua localtừ khóa.
  • Bên cạnh đó, Perl có toàn cầu, từ vựng (block), và gói phạm vi . PHP có toàn cầu, chức năng, đối tượng, tầng lớp và namespace phạm vi .
  • Trong Perl, các biến là toàn cục theo mặc định. Trong PHP, các biến trong hàm là cục bộ theo mặc định.
  • Perl hỗ trợ các cuộc gọi đuôi rõ ràng thông qua gotohàm.
  • Các nguyên mẫu của Perl cung cấp khả năng kiểm tra kiểu hạn chế hơn cho các đối số của hàm so với kiểu gợi ý của PHP . Do đó, các nguyên mẫu có nhiều tiện ích hạn chế hơn so với kiểu gợi ý.
  • Trong Perl, câu lệnh được đánh giá cuối cùng được trả về dưới dạng giá trị của một chương trình con nếu câu lệnh là một biểu thức (tức là nó có một giá trị), ngay cả khi câu lệnh trả về không được sử dụng. Nếu câu lệnh cuối cùng không phải là một biểu thức (tức là không có giá trị), chẳng hạn như một vòng lặp, giá trị trả về là không xác định (xem perlsub ). Trong PHP, nếu không có trả về rõ ràng, giá trị trả về là NULL .
  • Perl làm phẳng danh sách (xem perlsub ); đối với cấu trúc dữ liệu chưa được làm phẳng, hãy sử dụng tham chiếu.

    @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 không làm phẳng mảng.

  • Perl có khối mã đặc biệt ( BEGIN, UNITCHECK, CHECK, INITEND) được thực thi. Không giống như PHP auto_prepend_fileauto_append_file, không có giới hạn về số lượng của mỗi loại khối mã. Ngoài ra, các khối mã được xác định trong các tập lệnh, trong khi các tùy chọn PHP được đặt trong các tệp cấu hình máy chủ và mỗi thư mục.
  • Trong Perl, dấu chấm phẩy phân tách các câu lệnh . Trong PHP, nó kết thúc chúng, ngoại trừ thẻ đóng PHP ("?>") Cũng có thể kết thúc một câu lệnh.
  • Giá trị của các biểu thức trong Perl là phân biệt ngữ cảnh .
  • Các chỉ số con phủ định trong Perl có liên quan đến phần cuối của mảng. $bam[-1]là phần tử cuối cùng của mảng. Các chỉ số phụ phủ định trong PHP là các chỉ số con giống như bất kỳ chỉ số nào khác.
  • Trong Perl 5, các lớp dựa trên các gói và trông không giống các lớp trong PHP (hoặc hầu hết các ngôn ngữ khác). Các lớp Perl 6 gần với các lớp PHP hơn, nhưng vẫn khá khác biệt. (Perl 6 khác với Perl 5 theo nhiều cách, nhưng đó là chủ đề.) Nhiều điểm khác biệt giữa Perl 5 và PHP xuất phát từ thực tế là hầu hết các tính năng OO không được tích hợp sẵn trong Perl mà dựa trên các bản hack. Ví dụ, $obj->method(@args)được dịch sang một cái gì đó như (ref $obj)::method($obj, @args). Danh sách không đầy đủ:
    • PHP tự động cung cấp biến đặc biệt $thistrong các phương thức. Perl chuyển một tham chiếu đến đối tượng làm đối số đầu tiên cho các phương thức.
    • Perl yêu cầu các tham chiếu phải được may mắn để tạo một đối tượng. Bất kỳ tham chiếu nào cũng có thể được xem như một thể hiện của một lớp nhất định.
    • Trong Perl, bạn có thể thay đổi động kế thừa thông qua @ISAbiến gói .
  • Perl hỗ trợ nạp chồng toán tử .
  • Nói một cách chính xác, Perl không có các nhận xét đa dòng, nhưng hệ thống POD có thể được sử dụng cho cùng một ảnh hưởng.
  • Trong Perl, //là một toán tử. Trong PHP, đó là phần bắt đầu của một bình luận một dòng.
  • Cho đến phiên bản PHP 5.3, PHP đã hỗ trợ khủng khiếp cho các hàm ẩn danh ( create_functionhàm) và không hỗ trợ cho các hàm đóng.
  • PHP không có gì giống như các gói của Perl cho đến phiên bản 5.3, giới thiệu không gian tên .
  • Có thể cho rằng, hỗ trợ tích hợp của Perl cho các ngoại lệ trông gần như không có gì giống với các ngoại lệ trong các ngôn ngữ khác, đến nỗi chúng hầu như không giống như các ngoại lệ. Bạn đánh giá một khối và kiểm tra giá trị của $@( evalthay vì try, diethay vì throw). Các Lỗi Thử :: Tiny hỗ trợ mô-đun ngoại lệ khi bạn tìm thấy chúng trong các ngôn ngữ khác (cũng như một số module khác được liệt kê trong Lỗi của See Also phần).

PHP được lấy cảm hứng từ Perl giống như Phantom of the Paradise được lấy cảm hứng từ Phantom of the Opera , hay Strange Brew được lấy cảm hứng từ Hamlet . Tốt nhất bạn nên bỏ qua các đặc điểm cụ thể về hành vi của PHP khi học Perl, nếu không bạn sẽ gặp khó khăn.

Bây giờ não tôi đau, vì vậy tôi sẽ dừng lại.


21
Đây là một câu trả lời tuyệt vời, và tôi cảm thấy thật tệ khi thực hiện một cú nhấp chuột nhỏ như vậy về nó, nhưng bạn hầu như chỉ đúng về mảng Perl. Khi bạn có @array = qw(a b c)và bạn có $array[4] = 'e', nội dung của mảng không chính xác ('a', 'b', 'c', undef, 'e'); họ ('a', 'b', 'c', không tồn tại , 'e'). Đó là, [3]vị trí không giữ một con trỏ đến một đại lượng vô hướng là không xác định; nó không có gì cả (và existsnhà điều hành kiểm tra điều này). Một sự khác biệt nhỏ, nhưng là một sự khác biệt. :)
hobbs

9
MAN, đây là một trong những câu trả lời TỐT NHẤT những gì tôi từng thấy. Đặc biệt là phần về cảm hứng. Đơn giản là: mát mẻ và ĐÚNG. ;)
jm666

2
Con đường ngắn nhất để thiết lập một giá trị để $foonếu nó chưa được thiết lập có thểisset($foo) || $foo='default';
alexbusu

45

Khi PHP xuất hiện, mọi người đều ấn tượng với những điểm khác biệt chính so với Perl:

  1. Các biến đầu vào đã có trong phạm vi toàn cục, không cần phân tích cú pháp nhàm chán.
  2. Nhúng HTML. Chỉ cần <?php ... ?>bất cứ nơi nào. Không có mẫu nhàm chán.
  3. Thông báo lỗi trên màn hình. Không có bản ghi lỗi nhàm chán.
  4. Dễ học. Không đọc sách nhàm chán.

Thời gian trôi qua, ai cũng biết rằng mình không phải là kẻ vụ lợi, hehe ...


21

Tôi nhận thấy rằng hầu hết các trang PHP so với Perl dường như là

PHP tốt hơn Perl vì <insert lame reason here>

và hiếm khi so sánh hợp lý.

Về cú pháp, bạn sẽ thấy PHP thường dễ hiểu hơn Perl, đặc biệt là khi bạn có ít kinh nghiệm. Ví dụ: việc cắt bớt một chuỗi khoảng trắng đầu và cuối trong PHP chỉ đơn giản là

$string = trim($string);

Trong Perl, nó hơi khó hiểu hơn

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

(Tôi tin rằng điều này hiệu quả hơn một chút so với việc bắt và thay thế dòng đơn, và cũng dễ hiểu hơn một chút.) Tuy nhiên, mặc dù PHP thường giống tiếng Anh hơn, nhưng đôi khi nó vẫn cho thấy nguồn gốc của nó là một trình bao bọc cho mức C thấp, ví dụ, strpbrkstrspncó lẽ hiếm khi được sử dụng, bởi vì hầu hết những người mới học PHP đều viết các hàm tương đương của riêng họ cho bất kỳ thứ gì quá bí truyền, thay vì dành thời gian khám phá sách hướng dẫn. Tôi cũng thắc mắc về những lập trình viên mà tiếng Anh là ngôn ngữ thứ hai, vì mọi người đều ngang hàng với những thứ như Perl, phải học nó từ đầu.

Tôi đã đề cập đến hướng dẫn sử dụng. PHP có một hướng dẫn sử dụng trực tuyến tốt, và tiếc là nó cần nó. Thỉnh thoảng tôi vẫn đề cập đến nó cho những thứ cần đơn giản, chẳng hạn như thứ tự của các tham số hoặc quy ước đặt tên hàm. Với Perl, có thể bạn sẽ tìm thấy bạn đang đề cập đến một hướng dẫn nhiều như bạn bắt đầu và sau đó một ngày nào đó bạn sẽ có một a-ha khoảnh khắc và không bao giờ cần đến nó một lần nữa. Chà, ít nhất là không cho đến khi bạn nâng cao hơn và nhận ra rằng không chỉ có nhiều hơn một cách, có lẽ còn có một cách tốt hơn, ai đó có thể đã làm theo cách đó tốt hơn, và có lẽ bạn chỉ nên truy cập CPAN.

Perl có rất nhiều lựa chọn và cách diễn đạt khác nhau. Đây không hẳn là một điều tốt, mặc dù nó cho phép mã dễ đọc hơn nếu được sử dụng một cách khôn ngoan và ít nhất là một trong những cách bạn có thể quen thuộc. Có một số phong cách và thành ngữ nhất định mà bạn sẽ rơi vào, và tôi chân thành khuyên bạn nên đọc Các phương pháp hay nhất của Perl (sớm hơn là muộn), cùng với Perl Cookbook, Second Edition để bắt kịp tốc độ giải quyết các vấn đề thường gặp.

Tôi tin rằng lý do Perl được sử dụng ít thường xuyên hơn trong các môi trường lưu trữ chia sẻ là trong lịch sử, sự chậm chạp của CGI và việc máy chủ không sẵn sàng cài đặt mod_perl do các vấn đề về bảo mật và cấu hình đã khiến PHP trở thành một lựa chọn hấp dẫn hơn. Sau đó, chu kỳ tiếp tục, nhiều người học cách sử dụng PHP hơn vì nhiều máy chủ cung cấp nó hơn và nhiều máy chủ cung cấp nó hơn vì đó là những gì mọi người muốn sử dụng. Sự khác biệt về tốc độ và các vấn đề bảo mật được FastCGI đưa ra bàn luận trong những ngày này và trong hầu hết các trường hợp, PHP cũng hết FastCGI, thay vì để nó trong lõi của máy chủ web.

Cho dù đây có phải là trường hợp này hay không hoặc có những lý do khác, PHP đã trở nên phổ biến và vô số ứng dụng đã được viết trong đó. Đối với phần lớn những người chỉ muốn có một trang web cấp thấp với một blog hoặc thư viện ảnh đơn giản, PHP là tất cả những gì họ cần vì vậy đó là những gì mà các máy chủ quảng cáo. Sẽ không có gì ngăn cản bạn sử dụng Perl (hoặc bất kỳ thứ gì khác mà bạn chọn) nếu bạn muốn.

Ở cấp độ doanh nghiệp, tôi nghi ngờ bạn sẽ tìm thấy quá nhiều PHP trong quá trình sản xuất (và làm ơn, không có ai coi Facebook là một ví dụ ngược lại, tôi đã nói ở cấp độ doanh nghiệp ).


2
Thật hạnh phúc, ngày càng trở nên dễ dàng hơn khi sử dụng dịch vụ lưu trữ FastCGI, nơi cung cấp hiệu suất tốt mà không có biến chứng của mod_perl.
Quentin

@David Dorward: Được rồi. Tôi đang nói theo nghĩa lịch sử, vì FastCGI cũng cho hiệu suất / bảo mật tốt hơn mod_php. Tôi sẽ chỉnh sửa điều đó để thử và làm cho nó rõ ràng hơn một chút.
Duncan

3
Ví dụ cắt tỉa của bạn không có ý nghĩa. Whats tốt hơn 4 nhà khai thác hoặc ghi nhớ tất cả các thông số phù hợp và giá trị trả về của tất cả các chức năng PHP như 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
Perl dụ cắt của bạn có thể đơn giản hơn nhiều:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo

1
@Myforwik, ví dụ cắt tỉa của tôi nhằm chứng minh rằng Perl thiếu các chức năng rõ ràng, điều này có thể gây nhầm lẫn cho người mới bắt đầu. Một khi bạn học cú pháp, vâng, nó dễ dàng hơn nhiều so với việc đối phó với tất cả các điểm mâu thuẫn - tôi cũng đã đưa ra quan điểm về việc cần liên tục hướng dẫn sử dụng.
Duncan

9

Perl được sử dụng nhiều cho các trang web, chẳng hạn như Python và Ruby. Điều đó nói rằng, PHP được sử dụng thường xuyên hơn bất kỳ cách nào trong số đó. Tôi nghĩ các yếu tố quan trọng nhất trong đó là tính dễ triển khai của PHP và sự dễ dàng để bắt đầu với nó.

Sự khác biệt về cú pháp là quá nhiều để tổng hợp ở đây, nhưng nhìn chung đúng là nó có nhiều cách để thể hiện bản thân hơn (điều này được biết đến với cái tên TIMTWOTDI, Có Nhiều Cách Để Làm).


9

Điều yêu thích của tôi về Perl là cách nó xử lý các mảng / danh sách. Đây là ví dụ về cách bạn tạo và sử dụng hàm Perl (hoặc "chương trình con"), sử dụng hàm này cho các đối số:

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

Trong PHP, bạn có thể làm điều tương tự list(), nhưng nó không hoàn toàn giống nhau; trong danh sách Perl và mảng thực sự được xử lý giống nhau (thường là). Bạn cũng có thể làm những việc như:

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

Và một sự khác biệt khác mà bạn PHẢI biết, đó là các toán tử so sánh số / chuỗi. Trong Perl, nếu bạn sử dụng <, >, ==, !=, <=>, và như vậy, Perl chuyển đổi cả hai toán hạng để con số. Nếu bạn muốn chuyển đổi như dây đàn thay vào đó, bạn phải sử dụng lt, gt, eq, ne, cmp(tương đương tương ứng của các nhà khai thác được liệt kê trước đó). Ví dụ mà điều này thực sự sẽ giúp bạn:

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

Mảng và danh sách thường được xử lý giống nhau.
Brad Gilbert

Vâng đúng. Tôi nghĩ tôi đã định nói điều đó, nhưng lại quên mất. Đã chỉnh sửa để phản ánh điều đó.
crimson_penguin

4

Tôi không cần thêm bất cứ điều gì vào câu trả lời tuyệt vời của outis, tôi chỉ muốn hiển thị câu trả lời cho câu hỏi của bạn:

Tại sao Perl không được sử dụng cho các trang web động thường xuyên nữa? Điều gì đã khiến PHP trở nên phổ biến hơn nó?

Trước tiên, hãy kiểm tra một số trang web "Xu hướng việc làm" - và bạn có thể tự mình đưa ra nhận định.

như bạn có thể thấy, perl vẫn dẫn đầu - nhưng thích hợp hơn cho các ứng dụng thực tế chứ không phải cho đồ chơi. :)


1
Tôi nghĩ rằng sự so sánh này cũng là thú vị: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin Postelnicu

1
Đã sửa lỗi liên kết bị hỏng, VUI LÒNG SỬ DỤNG: simplehired.com/…
r4.

SH.com/a/jobtrends dường như không tồn tại. VUI LÒNG SỬ DỤNG: simplehired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.

@ r4.y liên kết của bạn không giống với liên kết ban đầu (hiện đã bị hỏng). Bản gốc hiển thị một biểu đồ (như ở trên), không phải một số danh sách công việc. Liên kết danh sách công việc nằm ngoài phạm vi.
jm666
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.