Perl과 PHP의 차이점


101

저는 Perl 5를 배울 계획이며 지금까지 PHP 만 사용했기 때문에 언어가 서로 어떻게 다른지 조금 알고 싶었습니다.

PHP가 "Perl 핵"의 집합으로 시작하면서 분명히 Perls 기능의 일부를 복제했습니다.

  • 구문의 주요 차이점은 무엇입니까? Perl을 사용하면 무언가를 표현할 수있는 더 많은 옵션과 방법이 있다는 것이 사실입니까?

  • Perl이 더 이상 동적 웹 사이트에 자주 사용되지 않는 이유는 무엇입니까? PHP가 더 인기를 얻은 이유는 무엇입니까?


2
궁금한 점이 있습니다. PHP 이후에 제 2 언어를 자유롭게 선택할 수 있다면 왜 더 현대적인 Python이나 Ruby 대신 Perl이 필요합니까?
jholster

37
Python과 Ruby가 더 현대적이기위한 기반은 무엇입니까?
Joshua Partogi

2
사람들이 언어를 비교하려고해서는 안된다고 생각합니다. 혼란으로 이어질뿐입니다.
Ben Shelock

11
@Ben : 구문 비교는 유틸리티가 제한적입니다. 기능을 비교하면 새로운 언어를 배우는 데 도움이 될 수 있습니다.
outis

1
나는 모든 언어가 디자이너들이 구상했던 것에 기반한 강점을 가지고 있다고 믿습니다. 특히 일련의 사용 사례를 기반으로합니다. 따라서 언어를 비교하는 것은 종종 편견과 혼란 스러울 수 있습니다.
CodeAngel 2013

답변:


284

Perl과 PHP는 비슷하지 않습니다. Perl 6이 아직 개발 중이기 때문에 Perl 5를 고려해 봅시다. 주제별로 대략적으로 분류 된 몇 가지 차이점 :

  • Perl은 정규 표현식 리터럴을 포함하여 기본 정규 표현식을 지원합니다. PHP는 Perl의 regexp 함수를 확장으로 사용합니다.
  • Perl에는 일치 ( , ), 따옴표 유사 ( , & c.), 지수 ( ), 문자열 반복 ( ) 및 범위 ( 및 )를 포함하여 훨씬 더 많은 연산자가 있습니다. PHP에는 오류 억제 연산자 ( ), (Perl에 메서드가 있음) 및 .=~!~qwqx**x.....@instanceofUniversal::isaclone
  • PHP에서는 new연산자입니다. Perl에서는 패키지에 정의 된 객체 생성 서브 루틴 의 일반적인 이름이며 언어에 관한 한 특별한 것은 없습니다.
  • Perl 논리 연산자는 인수를 반환 하고 PHP에서는 부울반환합니다 . 시험:

    $foo = '' || 'bar';

    각 언어로. Perl에서는 $foo ||= 'default'$ foo를 아직 설정하지 않은 경우 값으로 설정할 수도 있습니다. PHP에서이 작업을 수행하는 가장 짧은 방법은 $foo = isset($foo) ? $foo : 'default';(업데이트, PHP 7.0 이상에서 수행 할 수 있음 $foo = $foo ?? 'default')입니다.

  • 변수 이름은 내장 나타냅니다 펄이 세 가지를 가지고 있으며, 유형 지정자의 (a "라는 이름의 일부인의 유형, 시길 "), 그래서 $foo다른 변수보다 @foo%foo.
  • (이전 포인트와 관련) Perl에는 스칼라, 배열, 해시, 코드, 파일 / 디렉토리 핸들 및 형식에 대한 별도의 기호 테이블 항목이 있습니다. 각각에는 고유 한 네임 스페이스가 있습니다.
  • Perl은 기호 테이블에 대한 액세스를 제공 하지만, 조작하는 것은 희미한 마음을위한 것이 아닙니다. PHP에서 심볼 테이블 조작은 참조extract함수 생성으로 제한됩니다 .
  • "참조"는 PHP와 Perl에서 다른 의미를가집니다. PHP에서 참조 는 기호 테이블 별칭입니다. Perl에서 참조 는 스마트 포인터입니다.
  • Perl은 정수 인덱스 컬렉션 (배열)과 문자열 인덱스 컬렉션 (해시)에 대해 서로 다른 유형을 가지고 있습니다. PHP에서는 연관 배열 / 정렬 된 맵과 같은 유형 입니다.
  • Perl 배열은 희소하지 않습니다. 인덱스가 현재 배열 크기보다 큰 요소를 설정하면 중간에있는 모든 요소가로 설정됩니다 undefined( perldata 참조 ). PHP 배열은 희소합니다. 요소를 설정해도 중간 요소는 설정되지 않습니다.
  • Perl은 기본적으로 해시 및 배열 슬라이스를 지원 하며 슬라이스는 할당 가능하며 모든 종류의 용도가 있습니다. PHP에서는 array_slice슬라이스를 추출하고 슬라이스 array_splice에 할당하는 데 사용합니다.
  • 약간의 마술을 위해 PHP 에서 아래 첨자 연산자 에 대한 인수를 생략 할 수 있습니다 . Perl에서는 아래 첨자를 생략 할 수 없습니다.
  • Perl 해시는 정렬되지 않습니다 .
  • Perl에는 많은 사전 정의 된 매직 변수가 있습니다. PHP의 미리 정의 된 변수 는 매우 다른 목적을 가지고 있습니다.
  • Perl에는 명령문 수정자가 있습니다 . 일부 제어 명령문은 명령문 끝에 배치 할 수 있습니다.
  • Perl은 키워드 를 통한 동적 범위 지정 을 지원 local합니다.
  • 또한 Perl에는 전역, 어휘 (블록) 및 패키지 범위가 있습니다. PHP에는 전역, 함수, 객체, 클래스 및 네임 스페이스 범위가 있습니다.
  • Perl에서 변수는 기본적으로 전역입니다. PHP에서 함수의 변수는 기본적으로 로컬입니다.
  • Perl은 함수 를 통해 명시적인 마무리 호출 을 지원 goto합니다.
  • Perl의 프로토 타입 은 PHP의 유형 힌팅 보다 함수 인수에 대해 더 제한된 유형 검사를 제공 합니다 . 결과적으로 프로토 타입은 유형 힌트보다 유용성이 더 제한적입니다.
  • Perl에서는 return 문이 사용되지 않더라도 마지막으로 평가 된 문이 표현식이면 (즉, 값이있는 경우) 서브 루틴의 값으로 반환됩니다. 마지막 문이 루프와 같은 표현식이 아닌 경우 (즉, 값이없는 경우) 반환 값은 지정되지 않습니다 ( perlsub 참조 ). PHP에서 명시적인 반환이 없으면 반환 값은 NULL 입니다.
  • Perl은 목록을 병합합니다 ( perlsub 참조 ). 평탄화되지 않은 데이터 구조의 경우 참조를 사용하십시오.

    @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는 배열을 평면화하지 않습니다.

  • 펄이 특수 코드 블록 ( BEGIN, UNITCHECK, CHECK, INITEND) 실행되는. PHP이야 달리 auto_prepend_file하고 auto_append_file, 코드 블록의 각 유형의 수에 제한이 없습니다. 또한 코드 블록은 스크립트 내에서 정의되는 반면 PHP 옵션은 서버 및 디렉토리 별 구성 파일에서 설정됩니다.
  • Perl에서 세미콜론 은 문을 구분합니다 . PHP에서는 종료 하는 PHP 닫기 태그 ( "?>")도 문을 종료 할 수 있음을 제외하고, 그들을.
  • Perl의 표현식 값은 상황에 따라 다릅니다 .
  • Perl의 음의 첨자는 배열의 끝을 기준으로합니다. $bam[-1]배열의 마지막 요소입니다. PHP의 음의 첨자는 다른 첨자와 마찬가지로 첨자입니다.
  • Perl 5에서 클래스는 패키지를 기반으로하며 PHP (또는 대부분의 다른 언어)의 클래스처럼 보이지 않습니다. Perl 6 클래스는 PHP 클래스에 더 가깝지만 여전히 상당히 다릅니다. (Perl 6은 다른 많은면에서 Perl 5와 다르지만 주제를 벗어납니다.) Perl 5와 PHP의 많은 차이점은 대부분의 OO 기능이 Perl에 내장되어 있지 않고 해킹을 기반으로한다는 사실에서 비롯됩니다. 예를 들어, $obj->method(@args)같은으로 변환됩니다 (ref $obj)::method($obj, @args). 완전하지 않은 목록 :
    • PHP $this는 메서드에 특수 변수 를 자동으로 제공합니다 . Perl은 객체에 대한 참조를 메서드에 대한 첫 번째 인수로 전달합니다.
    • Perl은 객체를 생성하기 위해 참조를 축복 해야합니다. 모든 참조는 주어진 클래스의 인스턴스로 축복받을 수 있습니다.
    • Perl에서는 packages @ISA변수 를 통해 상속을 동적으로 변경할 수 있습니다 .
  • Perl은 연산자 오버로딩을 지원합니다 .
  • 엄밀히 말하면 Perl에는 여러 줄 주석이 없지만 POD 시스템은 동일한 효과를 위해 사용할 수 있습니다.
  • Perl에서는 //연산자입니다. PHP에서는 한 줄 주석의 시작입니다.
  • PHP 5.3까지 PHP는 익명 함수 ( create_function함수) 를 끔찍하게 지원했고 클로저를 지원하지 않았습니다.
  • PHP는 네임 스페이스 를 도입 한 버전 5.3까지 Perl의 패키지와 같은 것이 없었습니다 .
  • 틀림없이 Perl의 예외에 대한 내장 지원은 다른 언어의 예외와 거의 같지 않아서 예외처럼 거의 보이지 않습니다. 당신은 블록을 평가하고 값 확인 $@( eval대신 try, die대신을 throw). 오류 시도 :: 작은 다른 언어에서 찾을으로 모듈을 지원 예외 (뿐만 아니라에 나와있는 다른 모듈 오류의 관련 항목 섹션).

PHP는 Phantom of the ParadisePhantom of the Opera 에서 영감을 얻은 것과 같은 방식으로 Perl에서 영감을 얻었으며 Strange BrewHamlet 에서 영감을 받았습니다 . Perl을 배울 때 PHP의 동작 특성을 생각하지 않는 것이 가장 좋습니다. 그렇지 않으면 실패 할 것입니다.

지금 내 뇌가 아파서 그만 둘 게요.


21
이것은 환상적인 대답이고, 그런 작은 멍청이를 만드는 것이 안타깝지만 Perl 배열에 대해서는 대부분 옳습니다. 당신이 가지고 @array = qw(a b c)있고 당신이 할 때 $array[4] = 'e', 배열의 내용은 정확하지 않습니다 ('a', 'b', 'c', undef, 'e'); 그들이있어 ('a', 'b', 'c', 존재하지 않는 , 'e'). 즉, [3]슬롯은 undef 인 스칼라에 대한 포인터를 보유하지 않습니다. 그것은 아무것도 보유하지 않습니다 (그리고 exists운영자는 이것을 테스트합니다). 작은 차이이지만 차이가 있습니다. :)
hobbs

9
MAN, 이것은 내가 본 최고의 답변 중 하나입니다. 특히 영감에 관한 부분. 간단하게 : 멋지고 진실합니다. ;)
jm666

2
에 값 설정하는 최단 방법 $foo이 아직 설정되어 있지 않은 경우가있을 수 있습니다isset($foo) || $foo='default';
alexbusu

45

PHP가 등장했을 때 모두가 Perl과의 주요 차이점에 깊은 인상을 받았습니다.

  1. 입력 변수는 이미 전역 범위에 있으며 지루한 구문 분석이 없습니다.
  2. HTML 임베딩. 그냥 <?php ... ?>아무 곳. 지루한 템플릿이 없습니다.
  3. 화면 오류 메시지. 지루한 오류 로그를 엿볼 수 없습니다.
  4. 배우기 쉽습니다. 지루한 책 읽기가 없습니다.

시간이 지남에 따라 모두가 혜택이 아니라는 것을 알게되었습니다.


21

대부분의 PHP 대 Perl 페이지가

<여기에 절름발이 이유 삽입> 때문에 PHP가 Perl보다 낫습니다.

ilk, 그리고 거의 합리적인 비교를하지 않습니다.

구문 측면에서 볼 때 특히 경험이 거의 없을 때 PHP가 Perl보다 이해하기가 더 쉽다는 것을 알 수 있습니다. 예를 들어 PHP에서 선행 및 후행 공백 문자열을 자르는 것은 간단합니다.

$string = trim($string);

Perl에서는 다소 비밀 스럽습니다.

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

(나는 이것이 한 줄의 캡쳐와 교체보다 약간 더 효율적이라고 생각하며 조금 더 이해하기 쉽습니다.) 그러나 PHP는 종종 더 영어와 비슷하지만 때로는 여전히 낮은 레벨 C의 래퍼로 그 뿌리를 보여줍니다. 예를 들어, strpbrkstrspn대부분의 PHP의 장난하는 오히려 설명서를 탐험 시간을 보내는 것보다, 너무 난해한 아무것도 자신의 동등한 기능을 쓰기 때문에 아마 거의 사용되지 않습니다. 저는 또한 영어가 제 2 언어 인 프로그래머에 대해 궁금합니다. 모든 사람이 Perl과 같은 것을 처음부터 배워야하기 때문입니다.

나는 이미 매뉴얼을 언급했습니다. PHP는 훌륭한 온라인 매뉴얼을 가지고 있으며 불행히도 그것을 필요로합니다. 나는 여전히 매개 변수의 순서 나 함수 명명 규칙과 같이 단순해야하는 것들을 위해 때때로 그것을 참조한다. Perl을 사용 하면 시작할 때 매뉴얼을 많이 참조하고 언젠가는 a-ha 순간을 갖게되며 다시는 필요하지 않을 것입니다. 글쎄, 적어도 당신이 더 발전하고 한 가지 이상의 방법이있을뿐만 아니라 아마도 더 나은 방법이 있다는 것을 깨달을 때까지는 다른 사람이 이미 더 나은 방법을했을 것입니다. 그리고 아마도 당신은 CPAN을 방문해야 할 것입니다.

Perl에는 사물을 표현하는 더 많은 옵션과 방법이 있습니다. 이것이 반드시 좋은 것은 아니지만, 현명하게 사용하고 익숙한 방법 중 하나 이상을 사용하면 코드를 더 읽기 쉽게 할 수 있습니다. 자신이 빠지게 될 특정 스타일과 관용구가 있으며, 일반적인 문제를 해결하는 속도를 높이기 위해 Perl Cookbook, Second Edition 과 함께 Perl Best Practices (나중이 아니라 더 빨리)를 읽는 것이 좋습니다 .

공유 호스팅 환경에서 Perl이 덜 자주 사용되는 이유는 역사적으로 CGI가 느려진 것으로 인식되고 호스트 가 보안 및 구성 문제로 인해 mod_perl 을 설치하지 않기 때문에 PHP가 더 매력적인 옵션이 되었기 때문 이라고 생각합니다 . 그 이후주기는 계속되었고, 더 많은 호스트가 PHP를 제공했기 때문에 더 많은 사람들이 PHP를 사용하는 방법을 배웠고, 사람들이 사용하기를 원했기 때문에 더 많은 호스트가 PHP를 제공했습니다. 속도 차이와 보안 문제는 요즘 FastCGI에 의해 논쟁의 여지가 있으며, 대부분의 경우 PHP는 웹 서버의 핵심에 남겨 두지 않고 FastCGI가 부족합니다.

이것이 사실이든 아니든 다른 이유가 있든, PHP는 인기를 얻었고 수많은 애플리케이션이 작성되었습니다. 단순한 블로그 나 사진 갤러리가있는 초급 웹 사이트를 원하는 대다수의 사람들에게 PHP 만 있으면 호스트가 홍보 할 수 있습니다. 원하는 경우 Perl (또는 선택한 다른 항목)을 사용하는 데 방해가되는 것이 없어야합니다.

엔터프라이즈 수준에서는 프로덕션에서 너무 많은 PHP를 찾을 수 있을지 의심 스럽습니다 (그리고 반대 사례로 Facebook 에서는 한 지점도 없습니다 . 엔터프라이즈 수준에서 언급했습니다 ).


2
다행히도 mod_perl의 복잡성없이 적절한 성능을 제공하는 FastCGI 호스팅으로 호스팅하는 것이 더 쉬워지고 있습니다.
Quentin

@David Dorward : 좋아요. FastCGI는 mod_php보다 더 나은 성능 / 보안을 제공하기 때문에 역사적인 의미로 말하고 있습니다. 좀 더 명확하게 만들기 위해 편집하겠습니다.
Duncan

3
귀하의 트림 예제가 의미가 없습니다. 무슨 더 나은 4 운영자 또는 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 같은 모든 PHP 기능의 일관성이 매개 변수와 반환 값의 모든 기억
Myforwik

3
펄 트림 예를 훨씬 더 간단 할 수있다 :$str =~ s/^\s+|\s+$//g;
시스코 Zarabozo

1
@Myforwik, 내 트림 예제는 Perl에 명백한 기능이 없음을 보여주기위한 것이며, 이는 초보자에게 혼란 스러울 수 있습니다. 구문을 배우면 모든 불일치를 처리하는 것보다 훨씬 쉽습니다. 또한 매뉴얼이 지속적으로 필요하다는 점을 지적했습니다.
던컨

9

Perl은 웹 사이트에 많이 사용됩니다. 예를 들어 Python과 Ruby도 마찬가지입니다. 즉, PHP는 그 어느 것보다 더 자주 사용됩니다. 그 점에서 가장 중요한 요소는 PHP의 배포 용이성과 시작 용이성이라고 생각합니다.

구문의 차이는 여기에 요약하기에는 너무 많지만 일반적으로 자신을 표현하는 방법이 더 많다는 것은 사실입니다 (이는 TIMTWOTDI로 알려져 있으며이를 수행하는 방법은 여러 가지가 있습니다).


9

Perl에서 가장 좋아하는 점은 배열 / 목록을 처리하는 방식입니다. 다음은 인수에 이것을 사용하는 Perl 함수 (또는 "서브 루틴")를 만들고 사용하는 방법의 예입니다.

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

PHP에서는를 사용하여 비슷한 작업을 수행 할 수 list()있지만 완전히 동일하지는 않습니다. Perl에서 목록과 배열은 실제로 동일하게 취급됩니다 (일반적으로). 다음과 같은 작업도 수행 할 수 있습니다.

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

알아야 할 또 다른 차이점은 숫자 / 문자열 비교 연산자입니다. 당신이 사용하는 경우 펄, <, >, ==, !=, <=>, 등, 펄은 두 피연산자를 모두 숫자로 변환합니다. 대신 문자열로 변환 할 경우 사용해야합니다 lt, gt,eq , ne, cmp(사업자의 각각의 등가물은 이전에 나열된). 이것이 실제로 얻을 수있는 예 :

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

배열과 목록은 일반적 으로 동일하게 취급됩니다.
Brad Gilbert

네, 맞습니다. 나는 그것을 말할 것이라고 생각하지만 잊었다. 그것을 반영하기 위해 편집되었습니다.
crimson_penguin

4

outis의 환상적인 답변에 아무것도 추가 할 필요가 없습니다. 질문에 대한 답변 만 표시하고 싶습니다.

Perl이 더 이상 동적 웹 사이트에 자주 사용되지 않는 이유는 무엇입니까? PHP가 그것보다 더 인기를 얻은 이유는 무엇입니까?

먼저 "Job Trends"사이트를 확인하십시오-혼자서 판단 할 수 있습니다.

보시다시피 perl은 여전히 ​​선두 주자이지만 장난감이 아닌 실제 응용 프로그램에 더 적합합니다. :)


1
이 비교도 흥미 롭다고 생각합니다 : www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin Postelnicu

1
끊어진 링크 수정, 사용하십시오 : simplyhired.com/…
r4.

SH.com/a/jobtrends가 존재하지 않는 것 같습니다. 사용하십시오 : simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.

@ r4. 귀하의 링크는 원래 (현재 끊어진) 링크와 동일하지 않습니다. 원본은 일부 작업 목록이 아닌 그래프 (위와 같이)를 보여줍니다. 채용 공고 링크는 범위를 벗어납니다.
jm666 2015-08-05
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.