Conditional Statements
Indice
Un conditional statement è una struttura di controllo del flusso in mIRC che può
eseguire un insieme di comandi solo dopo aver confrontato o testato una condition.
In mIRC, una condizione ha valore logico falso se è $null, $false o 0.
| Contents - Intro - If Statements - Operators - Else - ElseIf - Reference of parameters - IIF Identifier |
Intro
Quasi mai vuoi che uno script faccia semplicemente sempre la stessa identica cosa. In molte occasioni vuoi che confronti due elementi e decida cosa fare in base al risultato di quel confronto.
Per esempio:
- L’utente ha scelto blu o rosso?
- Il numero è minore di 10?
- Sono su #mIRC?
- La variabile %counter è assegnata oppure no?
If Statements
In molte occasioni avrai bisogno di eseguire un’azione diversa in base a una condizione.
L’istruzione if consente di controllare quale parte del programma venga eseguita
o ignorata in base a un conditional statement. Senza un conditional statement come if,
uno script si comporterebbe quasi sempre nello stesso modo a ogni esecuzione.
Un’istruzione if esegue un blocco di codice solo se la condizione è vera.
Ma cosa significa vero? Una condizione vera è una condizione che viene valutata come qualsiasi
valore diverso da zero o da $null. Una condizione falsa è invece una condizione
che viene valutata come zero o $null.
La sintassi di base di un’istruzione if è:
if (condition) {
; codice da eseguire solo se la condizione è vera
}
Un tipico conditional statement consiste di due operandi e un operatore. Un operando è un’entità sulla quale viene eseguita un’operazione. Prendiamo per esempio il seguente conditional statement:
2 > 3
Nell’esempio sopra, > è il simbolo dell’operatore “maggiore di”.
L’esempio sopra ha 2 operandi: 2 e 3. In questo caso, il risultato è falso:
2 non è maggiore di 3.
Operators
Main article: Operators - mIRC
mIRC fornisce i seguenti tipi di operatori:
- Arithmetic Operators
- Math Comparison Operators
- String Comparison Operators
- Logical Operators
- Channel-related Operators
- List-related Operators
Example
Guarda il seguente esempio. In questo alias prendiamo una percentuale in formato decimale e la restituiamo in una forma leggibile. Vogliamo anche che una percentuale negativa venga racchiusa tra parentesi.
alias
percent {
; la percentuale è negativa?
if ($1 < 0) {
return ( $+ $calc($1 * 100) $+ % $+ )
}
return $calc($1 * -100) $+ %
}
Output di esempio:
//echo -a $percent(-.33)
(33%)
//echo -a $percent(.94)
94%
Nell’esempio sopra abbiamo usato un’istruzione if per controllare se l’input
dell’utente, $1, era minore di zero, così da gestirlo in modo diverso da un
numero decimale positivo. Quando l’istruzione if viene valutata come vera,
il codice dentro il suo body, racchiuso tra parentesi graffe, viene eseguito. Nel nostro caso,
ciò ha anche fatto restituire il valore alla routine chiamante, impedendo di fatto
l’esecuzione dell’altra istruzione.
Else
L’istruzione else ti permette di eseguire un blocco di codice quando la condizione
della parte if è falsa. Nota che la parte else non ha una propria
condizione: agisce semplicemente in base al risultato dell’istruzione if.
La sintassi di base è:
if (condition) {
; codice da eseguire solo se la condizione è vera
}
else {
; codice da eseguire solo se la condizione è falsa
}
Nell’esempio sotto assegniamo alla variabile %time il momento corretto della giornata
e poi mostriamo il risultato sullo schermo. Usiamo un’istruzione if per controllare
se l’orario, solo le ore, è maggiore di 10. Se è vero, imposta %time a
day, altrimenti a morning. In base al tuo orario attuale,
il risultato sarà “Good morning!” oppure “Good day!”.
alias
greet {
if ($time(H) > 10) {
var %time = day
}
else {
var %time = morning
}
echo -a Good %time $+ !
}
ElseIf
A questo punto è naturale chiedersi cosa fare quando c’è più di una condizione e ognuna deve
portare a un blocco di codice diverso. Un’istruzione elseif serve proprio a questo:
quando hai più conditional statements e ciascuno deve fare qualcosa di differente.
Se l’istruzione if iniziale restituisce falso, mIRC passerà all’elseif
e ne valuterà la condizione come farebbe con un normale if. Se la condizione è vera,
eseguirà il suo body. Se è falsa, passerà all’elseif successivo oppure a else.
La sintassi di base è:
if (condition) {
; fai qualcosa se la condizione è vera
}
elseif (condition) {
; fai qualcosa se /if è falso ma /elseif è vero
}
else {
; fai qualcosa se sia if che elseif sono falsi
}
Come apparirebbe in uno scenario reale? Ricordi il nostro script sul momento della giornata? E se volessimo controllare anche se è mezzogiorno o notte? Scriviamolo:
alias
greet {
var %hours = $time(H)
if (%hours < 10) {
var %time = morning
}
elseif (%hours == 12) {
; sono le 12 in punto
var %time = noon
}
elseif (%hours > 20) {
; sono passate le 20:00
var %time = night
}
else {
; se è 11 oppure tra le 13 e le 19
var %time = day
}
echo -a Good %time $+ !
}
Reference of parameters
mIRC fornisce due identificatori per recuperare il primo e il secondo parametro dell’ultima conditional statement valutata. Nota che questi identificatori restituiscono il primo e il secondo parametro dell’ultima condizione secondo le regole di short-circuit evaluation.
$v1 and $v2
Per esempio:
alias
ifExample {
if (4 < 5) {
echo -a yes, $v1 is less than $v2
}
}
Produrrà il seguente output:
yes, 4 is less than 5
IIF Identifier
IIF, inline if, è un identificatore integrato che valuta una condizione, in modo simile
a un’istruzione /if, e restituisce uno di due valori a seconda che la condizione
sia vera o falsa.
Sintassi:
$iif(condition, <code for true>)
; oppure
$iif(condition, <code for true>, <code for false>)
Nota: a differenza di un normale identificatore, viene valutata solo la parte vera oppure solo la parte falsa, in base alla condizione.
IIF example
alias
Example {
echo -a $iif($calc(1 + 1) == 2,1+1 Equals 2)
echo -a $iif(2 == 5,I Guess 2 Does Equals 5 After All,Nope 2 != 5)
}
Il codice sopra genera il seguente output:
1+1 Equals 2
Nope 2 != 5
Un uso comune di un inline if è decidere dove inviare una risposta a un comando.
Per esempio, su alcune reti ! significa messaggio in canale mentre
. significa notice.
on $*:text:/^([!.])example$/Si:#:{
var %send = $iif($regml(1) == ., notice $nick, msg $chan)
%send This is an example
%send This is another line!
}