Diferenças entre Perl e PHP [fechado]

101

Estou planejando aprender Perl 5 e como só usei PHP até agora, gostaria de saber um pouco sobre como as linguagens diferem umas das outras.

Como o PHP começou como um conjunto de "hacks Perl", ele obviamente clonou alguns recursos do Perls.

  • Quais são as principais diferenças na sintaxe? É verdade que com Perl você tem mais opções e maneiras de expressar algo?

  • Por que o Perl não é mais usado para sites dinâmicos com muita frequência? O que fez o PHP ganhar mais popularidade?

lok
fonte
2
Sendo curioso, tenho que perguntar: se você pode escolher livremente sua segunda linguagem depois do PHP, por que Perl em vez de Python ou Ruby mais moderno?
Jholster
37
Qual é a base para Python e Ruby serem mais modernos?
Joshua Partogi
2
Não acho que as pessoas devam tentar comparar idiomas. Isso só vai levar à confusão.
Ben Shelock,
11
@Ben: a sintaxe de comparação tem utilidade limitada. Comparar recursos pode ajudar no aprendizado de novos idiomas.
fora de
1
Eu acredito que cada linguagem tem sua força baseada no que os designers imaginaram para ela; particularmente com base em um conjunto de casos de uso. Portanto, comparar idiomas costuma ser tendencioso e confuso
CodeAngel

Respostas:

284

Perl e PHP são mais diferentes do que parecidos. Vamos considerar o Perl 5, já que o Perl 6 ainda está em desenvolvimento. Algumas diferenças, agrupadas aproximadamente por assunto:

  • Perl tem suporte de expressão regular nativa, incluindo literais regexp. PHP usa funções regexp do Perl como uma extensão.
  • Perl tem mais alguns operadores , incluindo correspondência ( =~, !~), aspas ( qw, qx& c.), Exponenciação ( **), repetição de string ( x) e intervalo ( ..e ...). PHP tem alguns operadores que Perl não tem, como o operador de supressão de erros ( @), instanceof(embora Perl tenha o Universal::isamétodo) e clone.
  • No PHP, newé um operador. Em Perl, é o nome convencional de uma sub-rotina de criação de objetos definida em pacotes, nada de especial no que diz respeito à linguagem.
  • Operadores lógicos Perl retornam seus argumentos, enquanto eles retornam booleanos em PHP. Experimentar:

    $foo = '' || 'bar';

    em cada idioma. Em Perl, você pode até $foo ||= 'default'definir $ foo para um valor se ainda não estiver definido. A maneira mais rápida de fazer isso em PHP é $foo = isset($foo) ? $foo : 'default';(Atualizar, em PHP 7.0+ você pode fazer $foo = $foo ?? 'default')

  • Nomes de variáveis Perl indicam tipo embutido, dos quais Perl tem três, e o especificador de tipo é parte do nome (chamado de " sigilo "), então $fooé uma variável diferente de @fooou %foo.
  • (relacionado ao ponto anterior) Perl tem entradas separadas na tabela de símbolos para escalares, arrays, hashes, código, identificadores de arquivo / diretório e formatos. Cada um tem seu próprio namespace.
  • Perl dá acesso à tabela de símbolos , embora manipulá-la não seja para os fracos de coração. No PHP, a manipulação da tabela de símbolos é limitada à criação de referências e da extractfunção.
  • Observe que "referências" tem um significado diferente em PHP e Perl. No PHP, as referências são apelidos de tabelas de símbolos. Em Perl, as referências são ponteiros inteligentes.
  • Perl tem diferentes tipos para coleções indexadas por inteiros (arrays) e coleções indexadas por string (hashes). Em PHP, eles são do mesmo tipo: um array associativo / mapa ordenado .
  • Os arrays Perl não são esparsos: definir um elemento com índice maior que o tamanho atual do array irá definir todos os elementos intermediários como undefined(ver perldata ). As matrizes PHP são esparsas; definir um elemento não definirá os elementos intermediários.
  • Perl suporta hash e fatias de array nativamente, e as fatias são atribuíveis, o que tem todos os tipos de usos . No PHP, você usa array_slicepara extrair uma fatia e array_spliceatribuir a uma fatia.
  • Você pode deixar de fora o argumento do operador subscrito em PHP para um pouco de mágica. Em Perl, você não pode deixar de fora o subscrito.
  • Hashes Perl não são ordenados .
  • Perl possui um grande número de variáveis ​​predefinidas e mágicas . As variáveis ​​predefinidas do PHP têm um propósito bem diferente.
  • Perl tem modificadores de instrução : algumas instruções de controle podem ser colocadas no final de uma instrução.
  • Perl suporta escopo dinâmico por meio da localpalavra - chave.
  • Além disso, Perl tem escopo global, léxico (bloco) e pacote . PHP tem escopo global, função, objeto, classe e namespace .
  • Em Perl, as variáveis ​​são globais por padrão. No PHP, as variáveis ​​nas funções são locais por padrão.
  • Perl suporta chamadas finais explícitas por meio da gotofunção.
  • Os protótipos do Perl fornecem verificação de tipo mais limitada para argumentos de função do que a sugestão de tipo do PHP . Como resultado, os protótipos têm uma utilidade mais limitada do que a sugestão de tipo.
  • Em Perl, a última instrução avaliada é retornada como o valor de uma sub-rotina se a instrução for uma expressão (ou seja, tem um valor), mesmo se uma instrução de retorno não for usada. Se a última instrução não for uma expressão (ou seja, não tiver um valor), como um loop, o valor de retorno não é especificado (consulte perlsub ). Em PHP, se não houver retorno explícito, o valor de retorno é NULL .
  • Perl nivela listas (veja perlsub ); para estruturas de dados não niveladas, use referências.

    @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 não simplifica arrays.

  • Perl tem blocos de código especiais ( BEGIN, UNITCHECK, CHECK, INITe END) que são executados. Ao contrário do PHP auto_prepend_filee auto_append_file, não há limite para o número de cada tipo de bloco de código. Além disso, os blocos de código são definidos nos scripts, enquanto as opções de PHP são definidas no servidor e nos arquivos de configuração por diretório.
  • Em Perl, o ponto-e-vírgula separa as instruções . No PHP, ele os termina , exceto que uma tag de fechamento do PHP ("?>") Também pode encerrar uma instrução.
  • O valor das expressões em Perl é sensível ao contexto .
  • Os subscritos negativos em Perl são relativos ao final do array. $bam[-1]é o elemento final da matriz. Os subscritos negativos em PHP são subscritos como qualquer outro.
  • No Perl 5, as classes são baseadas em pacotes e não se parecem em nada com as classes do PHP (ou da maioria das outras linguagens). As classes do Perl 6 estão mais próximas das classes do PHP, mas ainda são bastante diferentes. (Perl 6 é diferente do Perl 5 em muitos outros aspectos, mas isso está fora do tópico.) Muitas das diferenças entre o Perl 5 e o PHP surgem do fato de que a maioria dos recursos OO não são integrados ao Perl, mas baseados em hacks. Por exemplo, $obj->method(@args)é traduzido para algo como (ref $obj)::method($obj, @args). Lista não exaustiva:
    • PHP fornece automaticamente a variável especial $thisem métodos. Perl passa uma referência ao objeto como o primeiro argumento para métodos.
    • Perl requer referências a serem abençoadas para criar um objeto. Qualquer referência pode ser abençoada como uma instância de uma determinada classe.
    • Em Perl, você pode alterar dinamicamente a herança por meio da @ISAvariável de pacotes .
  • Perl suporta sobrecarga de operador .
  • Estritamente falando, Perl não tem comentários de várias linhas, mas o sistema POD pode ser usado para o mesmo efeito.
  • Em Perl, //é um operador. Em PHP, é o início de um comentário de uma linha.
  • Até o PHP 5.3, o PHP tinha péssimo suporte para funções anônimas (a create_functionfunção) e nenhum suporte para encerramentos.
  • O PHP não tinha nada como os pacotes do Perl até a versão 5.3, que introduziu namespaces .
  • Indiscutivelmente, o suporte embutido do Perl para exceções quase não se parece com exceções em outras linguagens, tanto que dificilmente parecem exceções. Você avalia um bloco e verifica o valor de $@(em evalvez de try, em dievez de throw). O módulo Error Try :: Tiny suporta exceções conforme você as encontra em outras linguagens (bem como alguns outros módulos listados na seção Consulte também de Error ).

PHP foi inspirado por Perl da mesma forma que Phantom of the Paradise foi inspirado por Phantom of the Opera , ou Strange Brew foi inspirado por Hamlet . É melhor deixar de pensar nas especificidades de comportamento do PHP ao aprender Perl, caso contrário, você se enganará.

Meu cérebro dói agora, então vou parar.

outis
fonte
21
Esta é uma resposta fantástica, e eu me sinto mal fazendo uma pequena nitpick tais nele, mas você está apenas na sua maioria direito sobre matrizes Perl. Quando você tem @array = qw(a b c)e faz $array[4] = 'e', o conteúdo do array não é exatamente ('a', 'b', 'c', undef, 'e'); eles são ('a', 'b', 'c', inexistentes , 'e'). Ou seja, o [3]slot não contém um ponteiro para um escalar que é undef; não contém absolutamente nada (e o existsoperador testa isso). Uma pequena diferença, mas uma diferença. :)
hobbs
9
HOMEM, esta é uma das MELHORES respostas que já vi. Principalmente a parte da inspiração. Simplesmente: legal e VERDADEIRO. ;)
jm666
2
O caminho mais curto para definir um valor, $foose ainda não estiver definido, pode serisset($foo) || $foo='default';
alexbusu
45

Quando o PHP entrou em cena, todos ficaram impressionados com as principais diferenças do Perl:

  1. Variáveis ​​de entrada já no escopo global, sem análise enfadonha.
  2. Incorporação de HTML. Em <?php ... ?>qualquer lugar. Sem modelos chatos.
  3. Mensagens de erro na tela. Nenhum registro de erro enfadonho peeks.
  4. Fácil de aprender. Nenhuma leitura de livro chato.

Com o passar do tempo, todos aprenderam que não eram benefício, hehe ...

Seu senso comum
fonte
21

Notei que a maioria das páginas PHP vs. Perl parecem ser do

PHP é melhor que Perl porque <insira o motivo coxo aqui>

laços, e raramente fazem comparações razoáveis.

Em termos de sintaxe, você descobrirá que o PHP é geralmente mais fácil de entender do que o Perl, principalmente quando você tem pouca experiência. Por exemplo, cortar uma string de espaços em branco à esquerda e à direita em PHP é simplesmente

$string = trim($string);

Em Perl, é um pouco mais enigmático

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

(Acredito que isso seja um pouco mais eficiente do que capturar e substituir uma única linha, e também um pouco mais compreensível.) No entanto, embora o PHP seja geralmente mais semelhante ao inglês, às vezes ainda mostra suas raízes como um invólucro para baixo nível C, por exemplo, strpbrke strspnprovavelmente raramente são usados, porque a maioria dos amadores de PHP escrevem suas próprias funções equivalentes para algo muito esotérico, ao invés de gastar tempo explorando o manual. Também me pergunto sobre os programadores para quem o inglês é a segunda língua, já que todos estão em pé de igualdade com coisas como Perl, tendo que aprendê-lo do zero.

Já mencionei o manual. PHP tem um bom manual online e, infelizmente, precisa dele. Ainda me refiro a ele de vez em quando para coisas que deveriam ser simples, como ordem de parâmetros ou convenção de nomenclatura de função. Com Perl, você provavelmente vai achar que você está se referindo a um manual muito como você a começar e, em seguida, um dia você vai ter um a-ha momento e nunca precisar dele novamente. Bem, pelo menos não até que você esteja mais avançado e perceba que não apenas existe mais de uma maneira, mas provavelmente existe uma maneira melhor, alguém provavelmente já fez dessa maneira melhor, e talvez você deva apenas visitar o CPAN.

Perl tem muito mais opções e maneiras de expressar coisas. Isso não é necessariamente bom, embora permita que o código seja mais legível se usado com sabedoria e pelo menos uma das maneiras com as quais você provavelmente está familiarizado. Existem certos estilos e expressões idiomáticas em que você se encontrará e recomendo sinceramente a leitura das Melhores Práticas de Perl (mais cedo ou mais tarde), junto com o Perl Cookbook, Segunda Edição para se atualizar rapidamente sobre a solução de problemas comuns.

Eu acredito que a razão pela qual o Perl é usado com menos frequência em ambientes de hospedagem compartilhada é que historicamente a lentidão percebida do CGI e a falta de vontade dos hosts em instalar o mod_perl devido a problemas de segurança e configuração tornaram o PHP uma opção mais atraente. O ciclo então continuou, mais pessoas aprenderam a usar PHP porque mais hosts o ofereciam e mais hosts o ofereciam porque era isso que as pessoas queriam usar. As diferenças de velocidade e problemas de segurança são discutidos pelo FastCGI atualmente e, na maioria dos casos, o PHP também fica sem FastCGI, em vez de deixá-lo no núcleo do servidor da web.

Seja ou não esse o caso ou por outras razões, o PHP se tornou popular e uma infinidade de aplicativos foram escritos nele. Para a maioria das pessoas que desejam apenas um site básico com um simples blog ou galeria de fotos, PHP é tudo o que precisam, então é isso que os hosts promovem. Não deve haver nada que o impeça de usar Perl (ou qualquer outra coisa que você escolher) se desejar.

Em um nível empresarial, duvido que você encontraria muito PHP em produção (e por favor, ninguém aponta o Facebook como contra-exemplo, eu disse em nível empresarial ).

Duncan
fonte
2
Felizmente, está se tornando mais fácil conseguir hospedagem com FastCGI, o que oferece um desempenho decente sem as complicações do mod_perl.
Quentin,
@David Dorward: Ok. Eu estava falando em um sentido histórico, já que FastCGI também oferece melhor desempenho / segurança do que mod_php. Vou editar isso para tentar torná-lo um pouco mais claro.
Duncan
3
Seu exemplo de acabamento não faz sentido. O que é melhor 4 operadores ou lembrando todos os parâmetros inconsistentes e valores de retorno de todas as funções do PHP como 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
Seu exemplo de acabamento Perl poderia ser muito mais simples:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo
1
@Myforwik, meu bom exemplo tinha a intenção de demonstrar que o Perl não possui funções óbvias, o que pode ser confuso para um iniciante. Depois que você aprende a sintaxe, sim, é muito mais fácil do que lidar com todas as inconsistências - eu também disse que precisava do manual constantemente.
Duncan
9

Perl é muito usado para sites, não menos que Python e Ruby, por exemplo. Dito isso, o PHP é usado com muito mais frequência do que qualquer um deles. Acho que os fatores mais importantes nisso são a facilidade de implantação do PHP e a facilidade de começar com ele.

As diferenças na sintaxe são muitas para resumir aqui, mas geralmente é verdade que ela tem mais maneiras de se expressar (isso é conhecido como TIMTWOTDI, há mais de uma maneira de fazer isso).

Leon Timmermans
fonte
9

Minha coisa favorita sobre Perl é a maneira como ele lida com arrays / listas. Aqui está um exemplo de como você faria e usaria uma função Perl (ou "sub-rotina"), que faz uso disso para argumentos:

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

No PHP, você poderia fazer algo semelhante list(), mas não é exatamente o mesmo; em Perl, listas e matrizes são tratadas da mesma forma (geralmente). Você também pode fazer coisas como:

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

E outra diferença que você DEVE saber, são os operadores de comparação numérica / string. Em Perl, se você usar <, >, ==, !=, <=>, e assim por diante, Perl converte ambos os operandos para números. Se você deseja converter como strings em vez disso, você tem que usar lt, gt, eq, ne, cmp(os respectivos equivalentes dos operadores listados anteriormente). Exemplos onde isso realmente levará você:

if ("a" == "b") { ... } # This is true.
if ("a" == 0) { ... } # This is also true, for the same reason.
crimson_penguin
fonte
Matrizes e listas geralmente são tratadas da mesma forma.
Brad Gilbert,
Sim, verdade. Acho que ia dizer isso, mas esqueci. Editado para refletir isso.
crimson_penguin
4

Não preciso acrescentar nada à fantástica resposta da outis, quero apenas mostrar a resposta para a sua pergunta:

Por que o Perl não é mais usado para sites dinâmicos com muita frequência? O que fez o PHP ganhar mais popularidade do que ele?

Verifique primeiro alguns sites de "Tendências de Trabalho" - e você poderá fazer o julgamento sozinho.

como você pode ver, o perl ainda é um líder - mas preferível para aplicações reais, não para brinquedos. :)

jm666
fonte
1
Acho que esta comparação também é interessante: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin Postelnicu
1
Link quebrado consertado, USE POR FAVOR: Simplyhired.com/…
r4.
SH.com/a/jobtrends parece não existir. POR FAVOR USE: Simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.
@ r4. seus links não são iguais ao link original (agora quebrado). O original mostra um gráfico (como o acima), não algumas listas de empregos. Os links de lista de empregos estão fora do escopo.
jm666