Qual è la differenza tra `$ this`,` @ that`, e `% those` in Perl?

Qual è la differenza tra $this , @that e %those in Perl?

Un utile mnemonico per i sigilli Perl è:

  • $ calar
  • @rray
  • %cenere

Matt Trout ha scritto un ottimo commento su blog.fogus.me sui sigilli Perl che penso sia utile, quindi ho incollato qui sotto:

In realtà, i sigilli perl non denotano il tipo di variabile – essi indicano la coniugazione – $ è ‘il’, @ è ‘questi’,% è ‘mappa di’ o così – il tipo di variabile è indicato con [] o {}. Puoi vederlo con:

 my $foo = 'foo'; my @foo = ('zero', 'one', 'two'); my $second_foo = $foo[1]; my @first_and_third_foos = @foo[0,2]; my %foo = (key1 => 'value1', key2 => 'value2', key3 => 'value3'); my $key2_foo = $foo{key2}; my ($key1_foo, $key3_foo) = @foo{'key1','key3'}; 

quindi, guardando il sigillo quando si scremano i codici perl, si dice quello che si sta andando, piuttosto che ciò su cui si sta operando, più o meno.

Questo è, ammettiamolo, davvero confuso finché non ci si abitua, ma una volta che ci si è abituati, può essere uno strumento estremamente utile per assorbire le informazioni mentre si scava il codice.

Hai ancora perfettamente il diritto di odiarlo, ovviamente, ma è un concetto interessante e immagino che potresti preferire odiare ciò che accade – in realtà – piuttosto che ciò che pensavi stesse succedendo 🙂

$this è un valore scalare, contiene 1 object come la apple

@that è una matrice di valori, contiene diversi like ("apple", "orange", "pear")

%those è un hash di valori, contiene coppie di valori chiave come ("apple" => "red", "orange" => "orange", "pear" => "yellow")

Vedi perlintro per maggiori informazioni sui tipi di variabili Perl.

L’inventore di Perl era un linguista e cercò di far diventare Perl un “linguaggio naturale”.

Da questo post :

Disambiguazione per numero, caso e ordine delle parole

Parte della ragione per cui una lingua può farla franca con certe ambiguità locali è che altre ambiguità sono soppresse da vari meccanismi. L’inglese usa il numero e l’ordine delle parole, con le vestigia di un sistema di casi nei pronomi: “L’uomo guardò gli uomini, e loro si voltarono a guardarlo.” È perfettamente chiaro in quella frase chi sta facendo cosa a chi. Allo stesso modo, Perl ha marcatori di numeri sui suoi nomi; cioè, $ dog è un cane e @dog è (potenzialmente) molti. Quindi $ e @ sono un po ‘come “questo” e “questi” in inglese . [enfasi aggiunta]

Le persone spesso cercano di bind sigilli a tipi variabili, ma sono solo vagamente correlati. È un argomento che ci ha colpito molto in Learning Perl ed Efficace Programmazione Perl perché è molto più facile capire Perl quando capisci i sigilli.

Molte persone dimenticano che variabili e dati sono in realtà cose separate. Le variabili possono memorizzare i dati, ma non hai bisogno di variabili per utilizzare i dati.

$ Indica un singolo valore scalare (non necessariamente una variabile scalare):

 $scalar_var $array[1] $hash{key} 

Il simbolo @ indica più valori. Quello potrebbe essere l’array nel suo insieme, una fetta o un dereferenziamento:

 @array; @array[1,2] @hash{qw(key1 key2)} @{ func_returning_array_ref }; 

Il % denota coppie (chiavi e valori), che potrebbe essere una variabile hash o una dereferenza:

 %hash %$hash_ref 

Sotto Perl v5.20, il % può ora denotare una porzione chiave / valore o un hash o array:

% array [@indices]; # restituisce coppie di indici ed elementi% hash {@keys}; # restituisce coppie di valori-chiave per quelle chiavi

Potresti voler esaminare i documenti perlintro e perlsyn per iniziare veramente a comprendere Perl (es. Read The Flipping Manual). 🙂

Detto ciò:

  • $this è uno scalare, che può memorizzare un numero (int o float), una stringa o un riferimento (vedi sotto);
  • @that è una matrice, che può memorizzare una lista ordinata di scalari (vedi sopra). È ansible aggiungere uno scalare a un array con le funzioni push o unshift (vedere perlfunc ) ed è ansible utilizzare un elenco separato da virgole di valori letterali o variabili scalari con valori separati da virgola per creare un valore letterale di matrice (ad esempio, my @array = ($a, $b, 6, "seven"); )
  • %those è un hash, che è un array associativo. Gli hash hanno coppie di valori-chiave di voci, in modo da poter accedere al valore di un hash fornendo la sua chiave. I valori letterali Hash possono anche essere specificati in modo molto simile agli elenchi, ad eccezione del fatto che ogni voce dispari è una chiave e ogni uno pari è un valore. Puoi anche usare un carattere => invece di una virgola per separare una chiave e un valore. (es. my %ordinals = ("one" => "first", "two" => "second"); )

Normalmente, quando si passano matrici o hash alle chiamate di subroutine, le singole liste vengono appiattite in una lunga lista. Questo a volte è desiderabile, a volte no. In quest’ultimo caso, è ansible utilizzare i riferimenti per passare un riferimento a un intero elenco come un singolo argomento scalare. La syntax e la semantica dei riferimenti sono difficili, tuttavia, e non rientrano nell’ambito di questa risposta. Se vuoi verificarlo, guarda perlref .