Differenze tra Perl e PHP [chiuso]


101

Sto progettando di imparare Perl 5 e poiché finora ho utilizzato solo PHP, volevo sapere un po 'su come le lingue differiscono l'una dall'altra.

Poiché PHP è iniziato come un insieme di "hack Perl", ha ovviamente clonato alcune delle funzionalità di Perls.

  • Quali sono le principali differenze nella sintassi? È vero che con Perl hai più opzioni e modi per esprimere qualcosa?

  • Perché Perl non viene più utilizzato molto spesso per i siti Web dinamici? Cosa ha reso PHP più popolare?


2
Essendo curioso, devo chiederti: se puoi scegliere liberamente la tua seconda lingua dopo PHP, perché Perl invece dei più moderni Python o Ruby?
jholster

37
Qual è la base affinché Python e Ruby siano più moderni?
Joshua Partogi

2
Non credo che le persone dovrebbero provare a confrontare le lingue. Porterà solo a confusione.
Ben Shelock

11
@ Ben: il confronto della sintassi ha un'utilità limitata. Il confronto delle caratteristiche può aiutare nell'apprendimento di nuove lingue.
outis

1
Credo che ogni linguaggio abbia la sua forza in base a ciò che i designer l'hanno immaginato; in particolare sulla base di una serie di casi d'uso. Pertanto il confronto delle lingue è spesso pregiudizievole e confuso
CodeAngel

Risposte:


284

Perl e PHP sono più diversi che uguali. Consideriamo Perl 5, poiché Perl 6 è ancora in fase di sviluppo. Alcune differenze, raggruppate grosso modo per argomento:

  • Perl ha il supporto nativo per le espressioni regolari, inclusi i letterali regexp. PHP usa le funzioni regexp di Perl come estensione.
  • Perl ha molti altri operatori , inclusi matching ( =~, !~), quote-like ( qw, qx& c.), Esponenziazione ( **), ripetizione di stringhe ( x) e intervallo ( ..e ...). PHP ha alcuni operatori che Perl non ha, come l' operatore di soppressione degli errori ( @), instanceof(sebbene Perl abbia il Universal::isametodo) e clone.
  • In PHP, newè un operatore. In Perl, è il nome convenzionale di una subroutine di creazione di oggetti definita nei pacchetti, niente di speciale per quanto riguarda il linguaggio.
  • Gli operatori logici Perl restituiscono i loro argomenti, mentre restituiscono booleani in PHP. Provare:

    $foo = '' || 'bar';

    in ogni lingua. In Perl, puoi anche $foo ||= 'default'impostare $ foo su un valore se non è già impostato. Il modo più breve per farlo in PHP è $foo = isset($foo) ? $foo : 'default';(Aggiorna, in PHP 7.0+ puoi farlo $foo = $foo ?? 'default')

  • I nomi delle variabili Perl indicano il tipo incorporato, di cui Perl ne ha tre, e l'identificatore del tipo fa parte del nome (chiamato " sigillo "), quindi $fooè una variabile diversa da @fooo %foo.
  • (relativo al punto precedente) Perl ha voci separate nella tabella dei simboli per scalari, array, hash, codice, handle di file / directory e formati. Ognuno ha il proprio spazio dei nomi.
  • Perl dà accesso alla tabella dei simboli , anche se manipolarla non è per i deboli di cuore. In PHP, la manipolazione della tabella dei simboli è limitata alla creazione di riferimenti e alla extractfunzione.
  • Nota che "riferimenti" ha un significato diverso in PHP e Perl. In PHP, i riferimenti sono alias di tabelle di simboli. In Perl, i riferimenti sono puntatori intelligenti.
  • Perl ha diversi tipi di raccolte indicizzate con numeri interi (array) e raccolte indicizzate con stringhe (hash). In PHP sono dello stesso tipo: un array associativo / una mappa ordinata .
  • Gli array Perl non sono sparsi: l'impostazione di un elemento con indice maggiore della dimensione corrente dell'array imposterà tutti gli elementi intermedi su undefined(vedi perldata ). Gli array PHP sono sparsi; l'impostazione di un elemento non imposterà gli elementi intermedi.
  • Perl supporta le slice di hash e array in modo nativo e le slice sono assegnabili, il che ha ogni tipo di utilizzo . In PHP, si utilizza array_sliceper estrarre una sezione e array_spliceper assegnarla a una sezione.
  • Puoi tralasciare l' argomento dell'operatore pedice in PHP per un po 'di magia. In Perl, non puoi lasciare fuori il pedice.
  • Gli hash Perl non sono ordinati .
  • Perl ha un gran numero di variabili predefinite e magiche . Le variabili predefinite di PHP hanno uno scopo completamente diverso.
  • Perl ha dei modificatori di istruzioni : alcune istruzioni di controllo possono essere poste alla fine di un'istruzione.
  • Perl supporta l' ambito dinamico tramite la localparola chiave.
  • Inoltre, Perl ha globale, lessicale (blocco), e il pacchetto portata . PHP ha globale, la funzione, oggetto, di classe e namespace ambito .
  • In Perl, le variabili sono globali per impostazione predefinita. In PHP, le variabili nelle funzioni sono locali per impostazione predefinita.
  • Perl supporta chiamate tail esplicite tramite la gotofunzione.
  • I prototipi di Perl forniscono un controllo del tipo più limitato per gli argomenti della funzione rispetto ai suggerimenti di tipo PHP . Di conseguenza, i prototipi hanno un'utilità più limitata rispetto ai suggerimenti di tipo.
  • In Perl, l'ultima istruzione valutata viene restituita come valore di una subroutine se l'istruzione è un'espressione (cioè ha un valore), anche se non viene utilizzata un'istruzione return. Se l'ultima istruzione non è un'espressione (cioè non ha un valore), come un ciclo, il valore restituito non è specificato (vedere perlsub ). In PHP, se non c'è un ritorno esplicito, il valore restituito è NULL .
  • Perl appiattisce le liste (vedi perlsub ); per strutture dati non appiattite, usa i riferimenti.

    @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 non appiattisce gli array.

  • Perl ha blocchi di codice speciali ( BEGIN, UNITCHECK, CHECK, INITe END) che vengono eseguiti. A differenza di PHP auto_prepend_filee auto_append_file, non c'è limite al numero di ogni tipo di blocco di codice. Inoltre, i blocchi di codice sono definiti all'interno degli script, mentre le opzioni PHP sono impostate nel server e nei file di configurazione per directory.
  • In Perl, il punto e virgola separa le istruzioni . In PHP, li termina , tranne per il fatto che anche un tag di chiusura PHP ("?>") Può terminare un'istruzione.
  • Il valore delle espressioni in Perl è sensibile al contesto .
  • Gli indici negativi in ​​Perl sono relativi alla fine dell'array. $bam[-1]è l'elemento finale dell'array. Gli pedici negativi in ​​PHP sono pedici come gli altri.
  • In Perl 5, le classi sono basate su pacchetti e non assomigliano a classi in PHP (o nella maggior parte degli altri linguaggi). Le classi Perl 6 sono più vicine alle classi PHP, ma comunque abbastanza diverse. (Perl 6 è diverso da Perl 5 in molti altri modi, ma è fuori tema.) Molte delle differenze tra Perl 5 e PHP derivano dal fatto che la maggior parte delle funzionalità OO non sono integrate in Perl ma basate su hack. Ad esempio, $obj->method(@args)viene tradotto in qualcosa di simile (ref $obj)::method($obj, @args). Elenco non esaustivo:
    • PHP fornisce automaticamente la variabile speciale $thisnei metodi. Perl passa un riferimento all'oggetto come primo argomento ai metodi.
    • Perl richiede che i riferimenti siano benedetti per creare un oggetto. Qualsiasi riferimento può essere benedetto come istanza di una data classe.
    • In Perl, puoi cambiare dinamicamente l'ereditarietà tramite la @ISAvariabile packages .
  • Perl supporta il sovraccarico degli operatori .
  • A rigor di termini, Perl non ha commenti su più righe, ma il sistema POD può essere utilizzato per lo stesso effetto.
  • In Perl, //è un operatore. In PHP, è l'inizio di un commento di una riga.
  • Fino a PHP 5.3, PHP aveva un terribile supporto per le funzioni anonime (la create_functionfunzione) e nessun supporto per le chiusure.
  • PHP non aveva niente come i pacchetti di Perl fino alla versione 5.3, che introduceva i namespace .
  • Probabilmente, il supporto integrato di Perl per le eccezioni non assomiglia quasi mai alle eccezioni in altre lingue, al punto che a malapena sembrano eccezioni. Valutate un blocco e controllate il valore di $@( evalinvece di try, dieinvece di throw). Il modulo Error Try :: Tiny supporta le eccezioni come le trovi in ​​altre lingue (così come alcuni altri moduli elencati nella sezione Error's See also ).

PHP è stato ispirato da Perl nello stesso modo in cui Phantom of the Paradise è stato ispirato da Phantom of the Opera , o Strange Brew è stato ispirato da Amleto . È meglio togliersi dalla mente le specifiche del comportamento di PHP quando si impara Perl, altrimenti si inciamperà.

Adesso mi fa male il cervello, quindi smetterò.


21
Questa è una risposta fantastica, e mi sento male di procedere a tale piccolo nitpick su di esso, ma si sta solo in gran parte ragione su array Perl. Quando hai @array = qw(a b c)e lo fai $array[4] = 'e', i contenuti dell'array non sono esattamente ('a', 'b', 'c', undef, 'e'); sono ('a', 'b', 'c', inesistenti , 'e'). Cioè, lo [3]slot non contiene un puntatore a uno scalare che è undef; non contiene nulla (e l' existsoperatore lo verifica). Una piccola differenza, ma una differenza. :)
hobbs

9
UOMO, questa è una delle MIGLIORI risposte che abbia mai visto. Soprattutto la parte sull'ispirazione. Semplicemente: cool e VERO. ;)
jm666

2
Il modo più breve per impostare un valore $foose non è già impostato potrebbe essereisset($foo) || $foo='default';
alexbusu

45

Quando PHP è entrato in scena, tutti sono rimasti colpiti dalle principali differenze rispetto a Perl:

  1. Variabili di input già nell'ambito globale, nessuna analisi noiosa.
  2. Incorporamento HTML. Proprio <?php ... ?>da nessuna parte. Nessun modello noioso.
  3. Messaggi di errore sullo schermo. Nessuna noiosa sbirciatina nel registro degli errori.
  4. Facile da imparare. Nessuna lettura noiosa del libro.

Col passare del tempo, tutti hanno imparato che non erano un vantaggio, hehe ...


21

Ho notato che la maggior parte delle pagine PHP e Perl sembrano appartenere a

PHP è migliore di Perl perché <inserisci qui un motivo debole>

ilk, e raramente fare confronti ragionevoli.

Dal punto di vista della sintassi, scoprirai che PHP è spesso più facile da capire di Perl, in particolare quando hai poca esperienza. Ad esempio, tagliare una stringa di spazi bianchi iniziali e finali in PHP è semplicemente

$string = trim($string);

In Perl è un po 'più criptico

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

(Credo che questo sia leggermente più efficiente di una singola riga di cattura e sostituzione, e anche un po 'più comprensibile.) Tuttavia, anche se PHP è spesso più simile all'inglese, a volte mostra ancora le sue radici come wrapper per C di basso livello, per esempio, strpbrke strspnsono probabilmente usati raramente, perché la maggior parte dei dilettanti PHP scrive le proprie funzioni equivalenti per qualcosa di troppo esoterico, piuttosto che passare il tempo ad esplorare il manuale. Mi chiedo anche quali siano i programmatori per i quali l'inglese è una seconda lingua, poiché tutti sono sullo stesso piano di cose come Perl, dovendo impararlo da zero.

Ho già accennato al manuale. PHP ha un ottimo manuale online e sfortunatamente ne ha bisogno. Mi riferisco ancora di tanto in tanto a cose che dovrebbero essere semplici, come l'ordine dei parametri o la convenzione di denominazione delle funzioni. Con Perl, probabilmente troverete si fa riferimento al manuale di un sacco come a iniziare e poi un giorno si avrà un a-ha attimo e mai bisogno di nuovo. Bene, almeno non finché non sarai più avanzato e ti renderai conto che non solo c'è più di un modo, probabilmente c'è un modo migliore, qualcun altro probabilmente lo ha già fatto in quel modo migliore, e forse dovresti semplicemente visitare CPAN.

Perl ha molte più opzioni e modi per esprimere le cose. Questa non è necessariamente una buona cosa, sebbene consenta al codice di essere più leggibile se usato con saggezza e almeno uno dei modi con cui probabilmente avrai familiarità. Ci sono alcuni stili e modi di dire in cui ti ritroverai a cadere, e posso consigliare vivamente di leggere Perl Best Practices (prima piuttosto che dopo), insieme a Perl Cookbook, Seconda Edizione per essere al passo con la risoluzione dei problemi comuni.

Credo che il motivo per cui Perl viene utilizzato meno spesso negli ambienti di hosting condiviso è che storicamente la lentezza percepita di CGI e la riluttanza degli host a installare mod_perl a causa di problemi di sicurezza e configurazione hanno reso PHP un'opzione più attraente. Il ciclo è poi continuato, più persone hanno imparato a usare PHP perché più host lo offrivano e più host lo offrivano perché era quello che le persone volevano usare. Le differenze di velocità e i problemi di sicurezza sono resi discutibili da FastCGI in questi giorni, e nella maggior parte dei casi anche PHP è a corto di FastCGI, piuttosto che lasciarlo nel nucleo del server web.

Che sia così o meno o ci siano altri motivi, PHP è diventato popolare e al suo interno sono state scritte una miriade di applicazioni. Per la maggior parte delle persone che desiderano solo un sito Web entry-level con un semplice blog o una galleria fotografica, PHP è tutto ciò di cui hanno bisogno, quindi è ciò che promuovono gli host. Non dovrebbe esserci nulla che ti impedisca di usare Perl (o qualsiasi altra cosa tu scelga) se vuoi.

A livello aziendale, dubito che troveresti troppo PHP in produzione (e per favore, nessuno punto su Facebook come controesempio, ho detto a livello aziendale ).


2
Fortunatamente, sta diventando più facile ottenere hosting con l'hosting FastCGI che offre prestazioni decenti senza le complicazioni di mod_perl.
Quentin

@David Dorward: Ok. Stavo parlando in senso storico, poiché FastCGI offre anche prestazioni / sicurezza migliori rispetto a mod_php. Lo modifico per provare a renderlo un po 'più chiaro.
Duncan

3
Il tuo esempio di assetto non ha senso. Cosa migliore 4 operatori o ricordare tutti i parametri incoerenti e valori di ritorno di tutte le funzioni PHP come 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
Il tuo esempio di rifinitura Perl potrebbe essere molto più semplice:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo

1
@ Myforwik, il mio esempio di trim aveva lo scopo di dimostrare che Perl manca di funzioni ovvie, il che può creare confusione per un principiante. Una volta appresa la sintassi, sì, è molto più facile che affrontare tutte le incongruenze - ho anche sottolineato il fatto che il manuale è costantemente necessario.
Duncan

9

Perl è usato molto per i siti web, non meno di Python e Ruby per esempio. Detto questo, PHP viene utilizzato molto più spesso di qualsiasi altro. Penso che i fattori più importanti in questo siano la facilità di implementazione di PHP e la facilità con cui iniziare.

Le differenze di sintassi sono troppe per riassumere qui, ma in generale è vero che ha più modi per esprimersi (questo è noto come TIMTWOTDI, C'è più di un modo per farlo).


9

La cosa che preferisco di Perl è il modo in cui gestisce array / elenchi. Ecco un esempio di come creare e utilizzare una funzione Perl (o "subroutine"), che ne fa uso per gli argomenti:

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

In PHP potresti fare una cosa simile list(), ma non è proprio la stessa cosa; in Perl gli elenchi e gli array sono effettivamente trattati allo stesso modo (di solito). Puoi anche fare cose come:

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

Un'altra differenza che DEVI conoscere sono gli operatori di confronto numerico / stringa. In Perl, se si utilizza <, >, ==, !=, <=>, e così via, Perl converte entrambi gli operandi ai numeri. Se si desidera convertire come stringhe, invece, è necessario utilizzare lt, gt, eq, ne, cmp(i rispettivi equivalenti degli operatori elencati in precedenza). Esempi in cui questo ti porterà davvero:

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

Gli array e gli elenchi vengono generalmente trattati allo stesso modo.
Brad Gilbert

Sì vero. Penso che stavo per dirlo, ma ho dimenticato. Modificato per riflettere questo.
crimson_penguin

4

Non ho bisogno di aggiungere nulla alla fantastica risposta di outis, voglio solo mostrare la risposta alla tua domanda:

Perché Perl non viene più utilizzato molto spesso per i siti Web dinamici? Cosa ha reso PHP più popolare di lui?

Si prega di controllare prima alcuni siti "Tendenze di lavoro" - e potrete esprimere il giudizio da soli.

come puoi vedere, perl è ancora un leader, ma preferibile per applicazioni reali non per i giocattoli. :)


1
Penso che anche questo confronto sia interessante: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin Postelnicu

1
Corretto il collegamento interrotto, SI PREGA DI USARE: simplyhired.com/…
r4.

SH.com/a/jobtrends sembra non esistere. SI PREGA DI UTILIZZARE: simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.

@ r4. i tuoi link non sono gli stessi del link originale (ora interrotto). L'originale mostra un grafico (come il precedente), non alcuni elenchi di lavori. I link alle offerte di lavoro sono al di fuori dell'ambito.
jm666
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.