# CPAN

Il Comprehensive Perl Archive Network (CPAN) è un archivio software di oltre 250.000 moduli software e relativa documentazione, scritti Perl da oltre 12.000 contributori. Il termine CPAN è spesso utilizzato sia per indicare l'archivio software vero e proprio che il programma Perl che funge da interfaccia con tale archivio e consente l'installazione automatizzata del software (una sorta di gestore di pacchetti). La maggior parte del software presente su CPAN è gratuito e open source.

## Storia

Creato da Jarkko Hietaniemi e Andreas König, questo vasto archivio di moduli, è online dal 26 ottobre 1995. Si ispira a CTAN (Comprehensive TeX Archive Network), un archivio simile ma dedicato ai file di formattazione TeX. Entrambi i progetti condividono l'obiettivo di creare un repository centralizzato e facilmente accessibile per una comunità di sviluppatori, fornendo loro un punto di riferimento unico per trovare e condividere risorse.
Il sito viene relazionato come mirror in altri 228 server in tutto il mondo.

## Funzionalità

Come molti linguaggi di programmazione, Perl, consente l'utilizzo di librerie esterne (o moduli) che sono file contenenti codice Perl riutilizzabile e che estendono le funzionalità di base del linguaggio.
Tipicamente i moduli Perl vengono installati in una directory di sistema dedicata che spesso indicata da una variabile d'ambiente nota come PERL5LIB. Nei sistemi operativi Unix-like i percorsi comuni sono /usr/lib/perl5, /usr/local/lib/perl5 e loro sottodirectory.
Perl viene fornito con un insieme di moduli di base, spesso chiamati core modules, che sono essenziali per la maggior parte delle applicazioni. Questi moduli forniscono funzionalità di base come la gestione delle stringhe, l'input/output, l'espressione regolare e molto altro.
Tra questi troviamo ExtUtils::MakeMaker la cui funzione principale è quella di generare automaticamente un Makefile a partire da un semplice script chiamato Makefile.PL. Questo Makefile contiene tutte le istruzioni necessarie per compilare, testare e installare un modulo Perl, soprattutto quelli che richiedono codice C o C++. Altro modulo essenziale e parte dei core modules è List::Util che fornisce un insieme di funzioni utili per manipolare le liste in Perl.
CPAN permette ai programmatori di condividere il proprio codice con la comunità, promuovendo la collaborazione e il riutilizzo del software. Opera su un modello decentralizzato. Ciascun autore mantiene e migliora i propri moduli mentre la struttura decentralizzata favorisce l'innovazione e permette la coesistenza di diverse soluzioni per lo stesso problema. Il forking, ovvero la creazione di nuovi moduli basati su quelli esistenti, è una pratica comune su CPAN che può portare a una sana competizione e a migliorare la qualità dei moduli offrendo una scelta più ampia. CPAN fornisce un sistema integrato per la segnalazione dei bug per ogni modulo caricato. Tuttavia, gli autori possono scegliere di utilizzare sistemi esterni come GitHub. I manutentori possono concedere ad altri utenti i permessi per contribuire o prendere in carico i loro moduli mentre gli amministratori di CPAN possono assegnare i moduli orfani a nuovi manutentori. CPAN conserva le versioni precedenti dei moduli, consentendo agli utenti di accedere a versioni precedenti se necessario. Un network secondario, chiamato BackPAN, garantisce ulteriormente la conservazione di queste versioni.
La cronologia completa di CPAN e di tutti i suoi moduli è disponibile come progetto GitPAN che consente di accedere alla cronologia completa di tutti i moduli e a quella dei loro fork. CPAN viene anche utilizzato per distribuire nuove versioni di Perl e progetti correlati quali Parrot e Raku.

## Struttura

Ogni libreria, in CPAN, è definita distribuzione. Una distribuzione include Il codice del modulo, la relativa documentazione, eventuali script di installazione (solitamente chiamati Makefile.PL o Build.PL) e altri file (potrebbero esserci file di configurazione o altri elementi a seconda del modulo specifico). Le nuove distribuzioni vengono caricate sul Perl Authors Upload Server, o PAUSE.