2014-04-24 1 views
7

Provenienti da altri linguaggi di programmazione, mi aspetto che le seguenti istruzioni generino lo stesso risultato. Qualcuno può spiegare perché la parentesi fa la differenza qui?Array e parentesi di Powershell

PS D:\> "ab",  "cd" 
ab 
cd 
PS D:\> "a"+"b" , "c"+"d" 
ab cd 
PS D:\> "a"+"b" , ("c"+"d") 
ab cd 
PS D:\> ("a"+"b"), "c"+"d" 
ab 
c 
d 
PS D:\> ("a"+"b"), ("c"+"d") 
ab 
cd 
PS D:\> 
+3

Consulta Get-Help about_operator_precedence per un elenco di tutti gli operatori e della rispettiva precedenza in un'espressione. – mjolinor

risposta

10

Le norme applicabili sono le seguenti:

  • Il , è un operatore unario o binario che crea una matrice dell'operando (s), ed ha la precedenza maggiore dell'operatore + .
  • L'operatore + può essere utilizzato per l'aggiunta numerica, la concatenazione di stringhe e la concatenazione di array. Il tipo di dati del ha lasciato l'operando e determina il tipo di operazione da eseguire. Se possibile, l'operando destro viene castato come tipo di dati dell'operando di sinistra; se non è possibile, viene generato un errore. *
  • Se la precedenza è uguale, la valutazione avviene da sinistra a destra.
  • Gli array vengono rappresentati come stringhe elencando gli elementi separati da spazi.
  • Le parentesi, come previsto, hanno una precedenza più alta rispetto a qualsiasi operatore e causano la valutazione dell'espressione racchiusa prima di qualsiasi elemento esterno alle parentesi.
  • L'output predefinito di un oggetto array è un elenco di elementi, uno su ogni riga.

* che spiega i risultati apparentemente inconsistenti come quella "foo" + 1 restituisce foo1, ma 1 + "foo" si dà un errore.

Quindi, diamo un'occhiata ai casi di test e analizziamo cosa succede seguendo la logica spiegata sopra.


Caso I:

"ab", "cd" 

Questo è molto semplice: l'operatore , crea un array di stringhe, due ab e bc.


Caso II:

"a" + "b", "c" + "d" 

Questo sembra contro-intuitivo a prima vista; la chiave è rendersi conto che , viene valutato prima dello +. Ecco come il risultato è ottenuto, passo dopo passo:

  1. "b", "c" viene valutata per prima (a causa , s' precedenza su +), creando un array di elementi b e c.
  2. Successivamente, l'operatore + viene applicato a "a" e l'array creato nel passaggio 1. Poiché l'operando di sinistra "a" è una stringa, viene eseguita una concatenazione di stringhe.
  3. Per concatenare una stringa con un array, la matrice viene eseguita come stringa. Un array di b e c diventa la stringa b c.
  4. Concatenazione a con b c rese ab c.
  5. Infine, ab c è concatenato con d per produrre il risultato finale, ab cd

Caso III:

"a"+"b" , ("c"+"d") 

Si ottiene lo stesso risultato coincidenza; la valutazione avviene in modo diverso:

  1. ("c"+"d") viene valutato per primo, a causa delle parentesi. Questa è una semplice concatenazione di stringhe di vaniglia, che risulta nella stringa cd.
  2. Successivamente, l'operatore , viene applicato a "b" e la stringa dal passaggio 1, creando una matrice di elementi b e cd. (Questo viene valutata prima "a" + "b" perché , ha precedenza maggiore +.)
  3. Poi, l'operatore + viene applicato "a" e la matrice creata nel passaggio 2. Poiché l'operando sinistro è una stringa, viene eseguita una concatenazione di stringhe.
  4. La serie di b e cd viene eseguita come stringa b cd.
  5. Le stringhe a e b cd sono concatenate, risultando nell'output finale ab cd.

caso IV:

("a" + "b"), "c" + "d" 

Questo è il banco di prova più interessante, e probabilmente il più intuitivo, perché produce risultati che possono apparire incoerente. Ecco come è valutato:

  1. Simile al Caso III punto 1, ("a" + "b") viene valutata prima, producendo la stringa ab.
  2. Il , viene applicato alla stringa dal passaggio 1 e "c", creando una matrice degli elementi ab e c.
  3. L'operatore + viene applicato all'array dal passaggio 2 e al token successivo, "d". Questa volta, l'operando di sinistra è una matrice, quindi viene eseguita una concatenazione di array.
  4. L'operando stringa "d" viene eseguito come una matrice di un elemento.
  5. I due array sono concatenati in una serie di elementi ab, c e d.

Caso V:

("a" + "b"), ("c" + "d") 

Ormai, dovrebbe essere facile vedere cosa succede qui:

  1. ("a" + "b") è valutato come stringa ab.
  2. ("c" + "d") viene considerato come la stringa cd.
  3. Il , viene applicato alle stringhe dei passaggi 1 e 2, creando un array di ab e cd.

Si può vedere la precedence table con il comando

Get-Help about_Operator_Precedence 

(Aiuto nomi DOC può essere scheda-compilato, in modo da salvare la digitazione, questo è help about_opTABTAB)

+0

Grazie per la fantastica spiegazione. Questo ha chiarito tutto per me. Essenzialmente, stava valutando le espressioni in questo modo: '" a "+ (" b "," c ") +" d "' e '((" a "+" b ")," c ") +" d " ' – sparebytes

+0

Fresco. Aggiungerò comunque l'analisi degli esempi, poiché le domande e le risposte di SO sono destinate a essere utili come materiale di riferimento per i futuri utenti. –

Problemi correlati