2012-11-27 15 views
6

Ad esempio, in "Programming Perl", ci sono frasi come questa:Cosa significa per un operatore legarsi in Perl?

Questi operatori di stringa legano più strettamente i corrispondenti operatori aritmetici.

In altri luoghi, sia in "PP" che in perldoc, gli autori usano frasi come "lega strettamente"; per esempio, quando ci si riferisce a = ~, o "si lega ancora più strettamente" quando si fa riferimento a ** (elevazione a potenza elevata).

Se questo fosse lo stesso della precedenza, non sarebbe possibile dire cose come "ancora più strettamente", immagino. Direbbe invece "precedenza superiore/inferiore".

Quindi cosa significa esattamente per un operatore legarsi?

+0

TLP, ho citato operatori specifici per gli ultimi due istanze. Per la prima frase citata, gli operatori erano moltiplicazione (*) e moltiplicazione di stringhe (x). Sono confuso dalla scelta delle parole per descrivere la precedenza degli operatori (se questo è ciò che è), da qui la mia domanda. – minya

+3

Sono abbastanza sicuro riguardo alla precedenza. – TLP

risposta

8

Si riferisce alla precedenza degli operatori. Nella dichiarazione

a = b + c * d 

La moltiplicazione ha una precedenza, e quindi "lega" più strettamente di aggiunta.

Gli operatori che si legano più strettamente vengono valutati prima di operatori con vincoli ridotti.

+0

Anche grazie alla persona che ha chiarito la semantica del verbo legare per me, ma successivamente cancellato il commento; e a @TLP per avere il tempo di spiegare. – minya

6

È possibile dare un'occhiata allo precedence list nella documentazione e confrontarlo con i testi che si leggono. Sono abbastanza sicuro che stiano parlando di precedenza, però.

La precedenza è una forma di rilegatura, in quanto "incolla" gli argomenti insieme con forza diversa. Un errore comune le persone fanno, ad esempio, sta utilizzando:

open my $fh, "<", "input.txt" || die $!; 

Che è un errore di silenzioso e letale, perché || "si lega più strettamente"/ha la precedenza superiore al comma , operatore, in modo da questa espressione diventa:

open my $fh, "<", ("input.txt" || die $!); 

E poiché la stringa "input.txt" è sempre vero, non importa cosa, dal momento che è una costante, la dichiarazione die non viene mai usato. E la dichiarazione open può quindi fallire in modo silenzioso, portando a errori difficili da trovare.

(La soluzione consiste nell'utilizzare l'operatore precedenza minore or anziché ||, o come mob sottolinea, override precedenza utilizzando parentesi.)

+0

Oppure, poiché TMTOWTDI, la soluzione è utilizzare le parentesi. – mob

+0

@mob Bene, questa era una soluzione correlata al contesto. – TLP