Come devo utilizzare la parola chiave "my" in Perl?


90

Continuo a vedere la parola chiave "my" davanti ai nomi delle variabili negli esempi di script Perl online ma non ho idea di cosa significhi. Ho provato a leggere le pagine di manuale e altri siti online ma ho difficoltà a discernere a cosa serva data la differenza tra come lo vedo usato e il manuale.

Ad esempio, è usato per ottenere la lunghezza dell'array in questo post: Trova la dimensione di un array in Perl

Ma il manuale dice:

A my dichiara che le variabili elencate sono locali (lessicalmente) al blocco, file o valutazione che lo racchiude. Se è elencato più di un valore, l'elenco deve essere inserito tra parentesi.

Cosa fa e come si usa?


3
Ri "è usato per ottenere la lunghezza dell'array in questo post", Niente affatto. mynon vi tenne minimamente conto. È l'operatore di assegnazione scalare ( =) che ha applicato il contesto scalare @arr.
ikegami

Se non è veramente "tuo", non dovresti usarlo.
icenac

Risposte:


139

mylimita l' ambito di una variabile. L'ambito di una variabile è dove può essere visto. Ridurre l'ambito di una variabile al punto in cui la variabile è necessaria è un aspetto fondamentale di una buona programmazione. Rende il codice più leggibile e meno soggetto a errori e si traduce in una serie di vantaggi derivati.

Se non dichiari una variabile utilizzando my, verrà invece creata una variabile globale. Questo è da evitare. L'uso use strict;dice a Perl che si desidera impedire la creazione implicita di variabili globali, motivo per cui dovresti sempre usare use strict;(e use warnings;) nei tuoi programmi.


Lettura correlata: Perché usare use strict;e use warnings;?


10
Finalmente una risposta che spiega perché .
ThisSuitIsBlackNot

Per le persone che vengono qui da JS: è essenzialmente come vare letin JavaScript. Senza 'use strict';JS ti consentirà di dichiarare nuove variabili globali senza nessuna parola chiave, che non è considerata la migliore pratica.
Caffè elettrico il

@Electric Coffee, In termini JS, la domanda sarebbe "Cosa fa lete varcosa e come dovrebbero essere usati?" E sì, la risposta sarebbe più o meno la stessa. (I letvars di JS sono molto simili a quelli di Perl my, tranne per il fatto che i letvars non possono essere catturati.)
ikegami

Volevo solo dire che se le persone arrivassero in Perl da JS, sarebbe un modo semplice per spiegare lo stesso concetto
Electric Coffee il

@ElectricCoffee 1) Un programmatore che comprende lo scoping non ha bisogno di spiegarglielo di nuovo dopo aver cambiato lingua. 2) Non sono sicuro di aver effettivamente spiegato lo scoping, in termini che un programmatore JS capirebbe o meno. Forse stavi cercando di spiegare use strict;? Ma non era quella la domanda e use strict;fa molto di più. O forse intendevi comunicare che mylimita l'ambito di vars un po 'come lete varfai, ma questa è praticamente la prima frase della risposta. 3) Se desideri rispondere a una domanda in modo diverso, è a questo che servono le risposte.
ikegami

27

Riepilogo rapido: mycrea una nuova variabile, localmodifica temporaneamente il valore di una variabile

Nell'esempio seguente, $ :: a si riferisce a $ a nello spazio dei nomi "globale".

$a = 3.14159;
{
  my $a = 3;
  print "In block, \$a = $a\n";
  print "In block, \$::a = $::a\n";
}
print "Outside block, \$a = $a\n";
print "Outside block, \$::a = $::a\n";

# This outputs
In block, $a = 3
In block, $::a = 3.14159
Outside block, $a = 3.14159
Outside block, $::a = 3.14159

cioè, localmodifica temporaneamente il valore della variabile, ma solo all'interno dell'ambito in cui esiste.

Fonte: http://www.perlmonks.org/?node_id=94007

Aggiornare

Sulla differenza tra oure myvedere

(Grazie a ThisSuitIsBlackNot ).


Ti va di spiegare "loro"? Li ho sempre trovati confusi.
rdodev

@rdodev: cosa intendi?
Igor Chubin

Continuo a vedere il codice Perl sia con "mio" che con "loro" e in pratica non ho mai capito la differenza.
rdodev

@rdodev: potresti inviarmi un link a un codice con their?
Igor Chubin

3
@rdodev Credo che si intende our: stackoverflow.com/questions/845060/...
ThisSuitIsBlackNot

4

Variabili private tramite my () è la documentazione principale per my.

Nell'esempio della dimensione dell'array che hai menzionato, non viene utilizzato per trovare la dimensione dell'array. Viene utilizzato per creare una nuova variabile per contenere la dimensione dell'array.

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.