programing

Perl과 PHP의 차이점

prostudy 2022. 9. 6. 21:38
반응형

Perl과 PHP의 차이점

Perl 5를 배울 예정인데, 지금까지 PHP만 사용해 왔기 때문에 언어마다 어떻게 다른지 조금 알고 싶었습니다.

PHP는 "Perl hacks" 세트로 시작했기 때문에 분명히 일부 Perls 기능을 복제했습니다.

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

  • 왜 Perl은 더 이상 동적 웹사이트에서 자주 사용되지 않는가?무엇이 PHP의 인기를 높였습니까?

Perl과 PHP는 유사점보다 더 다릅니다.Perl 6이 새로운 버전의 Perl이 아닌 독자적인 언어(Raku)가 되었기 때문에 Perl 5에 대해 생각해 봅시다.각 언어는 계속 진화하고 있기 때문에 이 목록의 일부 항목은 최신이 아닐 수 있습니다.독자는 각 언어의 현재 특징을 알기 위해 공식 문서를 참조해야 합니다.

주제별로 대략적으로 분류된 몇 가지 차이점:

  • Perl은 regexp 리터럴을 포함한 네이티브 정규 표현을 지원합니다.PHP는 Perl의 regexp 함수를 확장으로 사용합니다.

  • 많은 언어 기능이 PHP 언어 수준에서 지원되지만 Perl에서는 패키지로 구현됩니다(예: 생성기 및 일부 OOP 연산자).이들 중 일부는 다음과 같습니다.

  • 둘 다 문자열 내의 이스케이프 시퀀스를 지원하며 동일한 시퀀스의 일부를 지원합니다., Perl과 PHP는 동일한 기능(Unicode 코드 포인트 등)에 대해 몇 가지 다른 이스케이프 시퀀스를 가지고 있으며 공유되지 않는 시퀀스를 이스케이프합니다.

  • Perl에는 매칭(matching)을 포함한 연산자가 꽤 많이 있습니다.=~,!~), 따옴표 (qw,qx&c.), 문자열 반복(x 범위(..그리고....error suppression 연산자(PHP에는 Perl에는 없는 연산자가 몇 개 있습니다.@및 (Perl은 모듈 경유로 이들 중 일부를 제공합니다(등).

    • 지수화(**5.6 이전 버전에서는 PHP에서 사용할 수 없었습니다.
    • 우주선 비교 연산자(<=>)는 7.0 이전에는 PHP에서 사용할 수 없었습니다.Perl에서는<=>수치 비교용입니다(cmpstring). PHP에서는 동등한 값을 처리합니다.
  • PHP에서 는 연산자입니다.Perl에서는 패키지에 정의되어 있는 오브젝트 작성 서브루틴의 통칭으로 언어에 관한 한 특별한 것은 없습니다.

  • Perl 논리 연산자는 인수를 반환하고 PHP에서는 부산을 반환합니다.시험:

     $foo = '' || 'bar';
    

    각 언어에서.Perl에서는,$foo ||= 'default'세팅하다$foo값을 설정합니다(아직 설정되어 있지 않은 경우).

  • PHP 7.0에서 NULL 병합 연산자를 추가하고 7.4에서 NULL 병합 할당을 추가했습니다.??=이것들은 Perl과 비슷하지만, 보다 제한적입니다.||그 이유는 왼쪽이 다음인 경우에만 오른쪽을 반환되는 것은 왼쪽이NULLfalse 값이 아닌.Perl 5.10은 자체 NULL 병합 연산자를 추가했습니다. ('//'는 PHP에서 한 줄 코멘트를 시작합니다.)

  • Perl 변수 이름은 내장 유형을 나타내며, Perl에는 3개의 유형이 있으며 유형 지정자는 이름의 일부입니다('sigil'이라고 함).$foo와는 다른 변수입니다.@foo또는%foo.

  • (앞의 포인트와 관련) Perl에는 스칼라, 어레이, 해시, 코드, 파일/디렉토리 핸들 및 형식에 대한 개별 심볼 테이블 엔트리가 있습니다.각각 고유한 네임스페이스를 가집니다.

  • Perl은 심볼 테이블에 접근할 수 있지만, 조작하는 것은 심장이 약한 사람을 위한 것이 아닙니다.PHP에서 심볼 테이블 조작은 참조 및 함수 생성으로 제한됩니다.

  • "참조"는 PHP와 Perl에서 다른 의미를 가집니다.PHP에서 참조는 기호 테이블 별칭입니다.Perl에서는 참조가 스마트포인터입니다

  • Perl에는 정수 인덱스 컬렉션(어레이)과 문자열 인덱스 컬렉션(해시)의 유형이 다릅니다.PHP에서는 같은 유형입니다. 연관 배열/순서 맵입니다.

  • Perl 어레이는 희박하지 않습니다.어레이의 현재 크기보다 큰 인덱스를 가진 요소를 설정하면 초기화를 하지 않아도 모든 간섭 요소가 생성됩니다( 을 참조).PHP 배열은 희박합니다. 요소를 설정해도 간섭 요소가 생성되지 않습니다.

  • Perl은 기본적으로 해시 슬라이스와 어레이 슬라이스를 지원하며 슬라이스는 할당할 수 있으며 다양한 용도로 사용됩니다.PHP에서는 슬라이스를 추출하고 슬라이스에 할당하기 위해 사용합니다.

  • Perl은 모든 요소를 결합함으로써 어레이를 문자열로 보간합니다.$"PHP는 먼저 어레이를 문자열로 변환함으로써 어레이를 문자열로 보간합니다.그 결과 항상 "Array" 값이 됩니다.

  • 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는 5.6에서 시작하는 인수 목록('인수 언팩'이라고 함) 확산에 대한 지원을 추가했습니다. 이는 다음을 사용하여 명시적으로 수행되어야 합니다..... 7.4에서는 정수 지수에 대해서만 확산 연산자('어레이 언팩'이라는 별칭 아래)가 추가되었습니다.8.1에서는 이 동작이 문자열 인덱스로 확장되었습니다.

  • 7.4 이전 PHP에서는 정수 및 부동소수점 리터럴의 숫자 구분자로 밑줄을 사용할 수 없었습니다.

  • PHP의 서브스크립트 연산자에게 인수를 생략할 수 있습니다.Perl에서는 첨자를 생략할 수 없습니다.

  • Perl 해시는 순서가 없습니다.

  • Perl에는 다수의 사전 정의된 매직 변수가 있습니다.PHP의 미리 정의된 변수에는 전혀 다른 목적이 있습니다.

  • Perl에는 스테이트먼트 수식자가 있습니다.일부 제어문은 스테이트먼트 끝에 배치할 수 있습니다.

  • PHP는 8.0에서 식을 추가했습니다.

  • Perl은 를 통해 다이내믹 스코핑을 지원합니다.local키워드를 지정합니다.

  • 또한 Perl은 글로벌, 렉시컬(블록) 및 패키지 범위를 가지고 있습니다.PHP에는 전역, 함수, 개체, 클래스 및 네임스페이스 범위가 있습니다.

  • Perl에서는 변수는 기본적으로 글로벌합니다.PHP에서 함수의 변수는 기본적으로 로컬입니다.

  • Perl은 함수를 통한 명시적 테일콜을 지원합니다.

  • PHP가 함수 인수를 선언하기 위해 더 일반적인 매개 변수 목록을 사용하는 경우, Perl은 프로토타입을 가집니다.

    • 프로토타입은 컴파일 시 평가되므로 여러 상황(예: 메서드 호출)에서 점검되지 않습니다.
    • 프로토타입은 PHP의 유형 힌트보다 함수 인수에 대한 제한된 유형 검사를 제공합니다.결과적으로 프로토타입은 유형 암시보다 더 제한적인 효용성을 가집니다.
    • 파라미터에 대한 접근법이 다르면 가변함수, 기본 파라미터 값 및 명명된 파라미터 등 관련 기능에 영향을 줍니다.
  • 펄 pass-by-reference(비록 배열 인수 인수 목록에 평평하게 만들다, 요소를 참조로 전달된다)을 사용한다.참고로,"참조"의 펄(위에 언급한)의 특정한 의미에 부분적인 원인 때문에,"pass-by-reference"은 펄 문서에 다른 무언가가 또 있("참고 지나가는"더 정확할 것이다)을 의미하는 것이고, 방법을 주장 목록에 배열 및 해시 평탄화 피하기 위해 사용한다.사용할 경우 비록 pass-by-reference 명시적으로 개별 변수와variadic 매개 변수에 대해, 지정할 수 있PHP 기본적으로 pass-by-value을 사용한다.그것에 나왔을 때 값으로 전달되지만 원본 변수 자체는 다른 가치를 열기로 변경할 수 없는 개체는, 변경될 수 있음을 의미하는 변수 개체를 저장하는 것의 값이 핸들습니다.

  • 언제 힌트를 입력하면 PHP 펄에 있지 않: 다양한 정적 타이핑 기능 논쟁, 변수, 반환(일부 return-only 포함)과 nullable형식 선언, 형식 선언(8.1로)노조(8.0의)과 교차점을 제공한다.이러한 기능 중 대부분의 7.0부터 시작하여 추가되었다.

  • 만약 그 진술을 표시한 것이다(즉, 그것은 가치를 갖고)비록 return문 사용되지 않펄에서는, 마지막으로 평가된 진술은 서브 루틴의 값으로, 반환됩니다.루프 같은 만약 마지막 문구는 없어 표현(즉는 값을 가지고 있지 않), 반환 값은 지정되지 않은(perlsub 보).PHP에서, 만약 어떤 명확한 반환, 반환 값은 NULL.

  • 펄(특별한 코드를 덩이를 가지고 있다.BEGIN,UNITCHECK,CHECK,INIT그리고.END=실행됩니다.PHP고 auto_append_fileauto_prepend_file과 달리 코드 블록의 각 형식에는 제한이 없다.반면 PHP 옵션들은 서버와per-directory config 파일에 설정되어 있다는 것 또한, 코드 블록은 스크립트에 정의되어 있다.

  • 펄에서는 세미 진술을 분리하고 있다.PHP에서는, PHP 가까운 태그("…을 제외하고 그들을 종료시키는?>")또한 해지할 수 있다.

  • Perl 식 값은 컨텍스트에 따라 달라집니다.

  • Perl의 마이너스 첨자는 어레이의 끝에 상대적입니다. $bam[-1]는 배열의 마지막 요소입니다.PHP의 마이너스 서브스크립트는 다른 서브스크립트와 같습니다.

  • Perl 5에서는 클래스는 패키지에 기반하며 PHP(또는 대부분의 다른 언어)의 클래스와는 전혀 다릅니다.Perl 6 클래스는 PHP 클래스에 가깝지만 여전히 상당히 다릅니다. (Perl 6은 Perl 5와 다른 많은 면에서 다르지만, 그것은 주제에서 벗어났습니다.)Perl 5와 PHP의 많은 차이점은 대부분의 OO 기능이 Perl에 내장된 것이 아니라 Hack에 기반을 두고 있다는 사실에서 비롯됩니다.예를들면,$obj->method(@args)다음과 같은 것으로 번역됩니다.(ref $obj)::method($obj, @args). 소모되지 않는 목록:

    • PHP는 자동으로 특수 변수를 제공합니다.$this메서드에서.Perl은 오브젝트에 대한 참조를 메서드에 대한 첫 번째 인수로 전달합니다.
    • Perl에서는 오브젝트를 작성하기 위한 참조가 필요합니다.어떤 참조도 주어진 클래스의 예로서 축복받을 수 있습니다.
    • Perl에서는 패키지를 통해 상속을 동적으로 변경할 수 있습니다.@ISA변수.
    • PHP는 7.0 현재 익명 클래스를 지원합니다.
  • 주석(양쪽에서 "속성"이라고 함)은 PHP 8.0부터 사용할 수 있지만 PHP의 언어 기능Perl의 모듈입니다.

  • PHP 8.1enum이 추가되었습니다.일부 Perl 모듈은 유사한 기능을 제공하지만 적절한 Enum을 가지고 있지 않습니다(또한 타입의 처리 방법을 고려할 때 유용하지도 않습니다).

  • Perl은 연산자 오버로드를 지원합니다.

  • 둘 다 사용#한 줄 코멘트를 시작하는데 PHP는//(앞서 설명한 바와 같이 Perl에서는 NULL 결합 연산자입니다).

  • 엄밀히 말하면 Perl에는 여러 줄의 코멘트가 없지만 POD 시스템은 동일한 영향을 미칠 수 있습니다.

  • PHP 5.3까지, PHP는 익명 함수에 대한 끔찍한 지원을 가지고 있었습니다.create_function기능) 및 폐쇄를 지원하지 않는다.

  • PHP는 네임스페이스를 도입한 버전 5.3 이전까지는 Perl 패키지와 같은 것이 없었습니다.

  • Perl은 상수를 정의하거나 변수에 저장하거나 기호 테이블을 조작하거나 이들 중 하나를 수행하는 패키지를 사용하여 패키지 별칭을 만듭니다.PHP는 다음을 사용하여 네임스페이스 별칭을 만듭니다.use.

  • 예외에 대한 Perl의 기본 제공 지원은 다른 언어의 예외와 거의 비슷하지 않아 거의 예외처럼 보이지 않습니다.블럭을 평가하고 다음 값을 확인합니다.$@(eval대신try대신throwTryCatch and Try:작은 모듈에서는 다른 언어로 표시되는 예외를 지원합니다(또한 오류 참조 섹션에 나열된 일부 모듈도 마찬가지).Perl 5.34.0 에서는 catch표준 / 구문이 실험용으로 추가되어 있습니다.이것은 디폴트로 유효하게 되어 있지 않습니다.

한 가지 흥미로운 일은 언어들이 몇 가지 면에서 더 비슷해졌다는 것입니다. 비록 이것은 다른 언어에 영향을 준 것이 아니라 많은 현대 프로그래밍 언어에 도입된 새로운 특징의 결과입니다.

PHP는 Perl에서 영감을 받은 처럼 Phantom of the Paradise에서 영감을 받은 것이고 Strange BrewHamlet에서 영감을 받은 것입니다.Perl을 배울 때 PHP의 동작에 대한 자세한 내용은 잊어버리는 것이 좋습니다.그렇지 않으면 넘어질 거예요.

지금 머리가 아파서 그만둘 거예요.

PHP가 등장했을 때, 모든 사람들은 Perl과의 주요 차이점에 감탄했습니다.

  1. 입력 변수가 글로벌 범위에 이미 있으며 지루한 구문 분석이 없습니다.
  2. HTML 임베딩그저.<?php ... ?>아무 곳이나.지루한 템플릿은 없습니다.
  3. 화면에 에러 메세지가 표시된다.지루한 오류 로그 피크는 없습니다.
  4. 배우기 쉽다.지루한 책 읽기 금지.

시간이 흐르면서, 모두가 그것이 이익이 아니라는 것을 알게 되었다.

나는 대부분의 PHP vs. Perl 페이지가 다음과 같은 것으로 보인다는 것을 알아챘다.

PHP는 Perl보다 <여기에 lame reason 삽입>이 더 좋습니다.

거의 비교가 되지 않는 것 같아요.

구문 면에서는 특히 경험이 적은 경우 PHP가 Perl보다 이해하기 쉽다는 것을 알 수 있습니다.예를 들어, PHP에서 선행 및 후행 공백 문자열을 트리밍하는 것은 단순합니다.

$string = trim($string);

Perl에서는 좀 더 암호화되어 있습니다.

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

(한 줄의 캡처와 치환보다 조금 더 효율적이며 이해하기 쉽다고 생각합니다.)그러나 PHP는 종종 영어에 더 가깝지만 낮은 레벨의 C를 위한 래퍼로서 그 뿌리를 보여주기도 합니다. 예를 들어,strpbrk그리고.strspn대부분의 PHP dabbler는 매뉴얼을 탐색하는 데 시간을 할애하지 않고 너무 난해한 것에 대해 그들만의 동등한 함수를 작성하기 때문에 아마도 거의 사용되지 않을 것입니다.또, Perl등으로부터 영어를 제2외국어로 하는 프로그래머에 대해서도 궁금합니다.

I have already mentioned the manual. PHP has a fine online manual, and unfortunately it needs it. I still refer to it from time to time for things that should be simple, such as order of parameters or function naming convention. With Perl, you will probably find you are referring to the manual a lot as you get started and then one day you will have an a-ha moment and never need it again. Well, at least not until you're more advanced and realize that not only is there more than one way, there is probably a better way, somebody else has probably already done it that better way, and perhaps you should just visit CPAN.

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.

I believe the reason Perl is used less often in shared hosting environments is that historically the perceived slowness of CGI and hosts' unwillingness to install mod_perl due to security and configuration issues has made PHP a more attractive option. The cycle then continued, more people learned to use PHP because more hosts offered it, and more hosts offered it because that's what people wanted to use. The speed differences and security issues are rendered moot by FastCGI these days, and in most cases PHP is run out of FastCGI as well, rather than leaving it in the core of the web server.

Whether or not this is the case or there are other reasons, PHP became popular and a myriad of applications have been written in it. For the majority of people who just want an entry-level website with a simple blog or photo gallery, PHP is all they need so that's what the hosts promote. There should be nothing stopping you from using Perl (or anything else you choose) if you want.

At an enterprise level, I doubt you would find too much PHP in production (and please, no-one point at Facebook as a counter-example, I said enterprise level).

Perl is used plenty for websites, no less than Python and Ruby for example. That said, PHP is used way more often than any of those. I think the most important factors in that are PHP's ease of deployment and the ease to start with it.

The differences in syntax are too many to sum up here, but generally it is true that it has more ways to express yourself (this is know as TIMTWOTDI, There Is More Than One Way To Do It).

My favorite thing about Perl is the way it handles arrays/lists. Here's an example of how you would make and use a Perl function (or "subroutine"), which makes use of this for arguments:

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

In PHP you could do a similar thing with list(), but it's not quite the same; in Perl lists and arrays are actually treated the same (usually). You can also do things like:

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

And another difference that you MUST know about, is numerical/string comparison operators. In Perl, if you use <, >, ==, !=, <=>, and so on, Perl converts both operands to numbers. If you want to convert as strings instead, you have to use lt, gt, eq, ne, cmp (the respective equivalents of the operators listed previously). Examples where this will really get you:

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

I do not need add anything to outis's fantastic answer, i want only show the answer for you question:

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

Please check first some "Job Trends" sites - and you can make the judgement alone.

as you can see, perl is still a leader - but preferable for real applications not for toys. :)

ReferenceURL : https://stackoverflow.com/questions/2534756/differences-between-perl-and-php

반응형