Perl과 PHP의 차이점
저는 Perl 5를 배울 계획이며 지금까지 PHP 만 사용했기 때문에 언어가 서로 어떻게 다른지 조금 알고 싶었습니다.
PHP가 "Perl 핵"의 집합으로 시작하면서 분명히 Perls 기능의 일부를 복제했습니다.
구문의 주요 차이점은 무엇입니까? Perl을 사용하면 무언가를 표현할 수있는 더 많은 옵션과 방법이 있다는 것이 사실입니까?
Perl이 더 이상 동적 웹 사이트에 자주 사용되지 않는 이유는 무엇입니까? PHP가 더 인기를 얻은 이유는 무엇입니까?
Perl과 PHP는 비슷하지 않습니다. Perl 6이 아직 개발 중이기 때문에 Perl 5를 고려해 봅시다. 주제별로 대략적으로 분류 된 몇 가지 차이점 :
- Perl은 정규 표현식 리터럴을 포함하여 기본 정규 표현식을 지원합니다. PHP는 Perl의 regexp 함수를 확장으로 사용합니다.
- Perl에는 일치 ( , ), 따옴표 유사 ( , & c.), 지수 ( ), 문자열 반복 ( ) 및 범위 ( 및 )를 포함하여 훨씬 더 많은 연산자가 있습니다. PHP에는 오류 억제 연산자 ( ), (Perl에 메서드가 있음) 및 .
=~
!~
qw
qx
**
x
..
...
@
instanceof
Universal::isa
clone
- 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
,INIT
및END
) 실행되는. 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
변수 를 통해 상속을 동적으로 변경할 수 있습니다 .
- PHP
- Perl은 연산자 오버로딩을 지원합니다 .
- 엄밀히 말하면 Perl에는 여러 줄 주석이 없지만 POD 시스템은 동일한 효과를 위해 사용할 수 있습니다.
- Perl에서는
//
연산자입니다. PHP에서는 한 줄 주석의 시작입니다. - PHP 5.3까지 PHP는 익명 함수 (
create_function
함수) 를 끔찍하게 지원했고 클로저를 지원하지 않았습니다. - PHP는 네임 스페이스 를 도입 한 버전 5.3까지 Perl의 패키지와 같은 것이 없었습니다 .
- Arguably, Perl's built-in support for exceptions looks almost nothing like exceptions in other languages, so much so that they scarcely seem like exceptions. You evaluate a block and check the value of
$@
(eval
instead oftry
,die
instead ofthrow
). TheErrorTry::Tiny module supports exceptions as you find them in other languages (as well as some other modules listed in Error's See Also section).
PHP was inspired by Perl the same way Phantom of the Paradise was inspired by Phantom of the Opera, or Strange Brew was inspired by Hamlet. It's best to put the behavior specifics of PHP out of your mind when learning Perl, else you'll get tripped up.
My brain hurts now, so I'm going to stop.
When PHP came to the scene, everyone were impressed with main differences from Perl:
- Input variables already in the global scope, no boring parsing.
- HTML embedding. Just
<?php ... ?>
anywhere. No boring templates. - On-screen error messages. No boring error log peeks.
- Easy to learn. No boring book reading.
As the time passed, everyone learned that they were not a benefit, hehe...
I've noticed that most PHP vs. Perl pages seem to be of the
PHP is better than Perl because <insert lame reason here>
ilk, and rarely make reasonable comparisons.
Syntax-wise, you will find PHP is often easier to understand than Perl, particularly when you have little experience. For example, trimming a string of leading and trailing whitespace in PHP is simply
$string = trim($string);
In Perl it is the somewhat more cryptic
$string =~ s/^\s+//;
$string =~ s/\s+$//;
(I believe this is slightly more efficient than a single line capture and replace, and also a little more understandable.) However, even though PHP is often more English-like, it sometimes still shows its roots as a wrapper for low level C, for example, strpbrk
and strspn
are probably rarely used, because most PHP dabblers write their own equivalent functions for anything too esoteric, rather than spending time exploring the manual. I also wonder about programmers for whom English is a second language, as everybody is on equal footing with things such as Perl, having to learn it from scratch.
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. :)
참고URL : https://stackoverflow.com/questions/2534756/differences-between-perl-and-php
'programing tip' 카테고리의 다른 글
JavaScript IF 문에서 OR 조건을 사용하는 방법은 무엇입니까? (0) | 2020.08.17 |
---|---|
시트가 있는지 테스트 또는 확인 (0) | 2020.08.17 |
'ng build'후 angular-cli에서 dist-folder 경로를 변경하는 방법 (0) | 2020.08.17 |
UNIX 쉘 스크립트에서 10 진수를 16 진수로 변환 (0) | 2020.08.17 |
Android에서 Viewpager 컨트롤러의 속도 저하 (0) | 2020.08.17 |