Hybris offre un set di operatori non standard, ovvero che sono al di fuori delle categorie degli operatori aritmetici, degli operatori logici e degli operatori booleani che servono per operare sui tipi più complessi come le mappe, le matrici, le stringhe e gli alias.
Questo operatore serve per concatenare in una stringa due o più valori segue la sintassi :
a + b
e concatena i valori di 'a' e di 'b' restituendo una stringa composta.
La forma :
a += b
equivale a :
a = a + b
L'operatore subscript si utilizza per i tipi array, map, matrix e string e serve per accedere in lettura e/o scrittura ad un dato elemento della lista .
Nel caso degli array :
a[] = b
aggiunge in coda l'elemento 'b' all'array 'a', mentre
b = a[10]
che è valido sia per le stringhe che per gli array, restituisce il decimo valore contenuto nell'array o nella stringa 'a' .
Nel caso di map
a["chiave"] = b
mappa l'elemento 'b' dentro 'a' con la chiave “chiave” che sarà successivamente accessibile tramite
b = a["chiave"]
Nel caso di una matrice, la logica è quella degli array con la differenza che si considera un accesso bidimensionale, ovvero
a[10][] = b
aggiunge in coda l'elemento 'b' nella decima riga della matrice 'a' e
b = a[10][0]
restituisce il primo valore della decima riga della matrice 'a', cioè alle coordinate (10,0).
L'operatore range serve per ottenere velocemente un array di valori costanti compresi in un dato intervallo noto nella forma
a = b .. c
dove 'a' è l'array risultante, 'b' è il valore iniziale dell'intervallo e 'c' è il valore finale. Come si può vedere nella sezione sui costrutti iterativi, l'operatore range può essere usato nei seguenti modi.
Esempio 1 :
a = 1 .. 10; foreach( i of a ){ println(i); }
Esempio 2 :
foreach( i of 1 .. 10 ){ println(i); }
Esempio 3 :
charset = 'a' .. 'z'; foreach( c of charset ){ println(c); }
Questo operatore serve per applicare un espressione regolare su una data stringa, effettuando un match o un estrazione di token nel caso nella regexp siano specificate due o più parentesi di capture.
Esempio 1 (match booleano) :
mails = [ "evilsocket@gmail.com", "lamer@foo" ]; foreach( mail of mails ){ if( mail ~= "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/i" ){ print( mail + " è un email valida .\n" ); } else{ print( mail + " NON è un email valida .\n" ); } }
Esempio 2 (estrazione di token) :
html = http_get( "www.google.it" , "/" ); links = html ~= "/a[^>]+href=[\"']([^\"']+)[\"']/i"; foreach( link of links ){ print( "\t" + link + "\n" ); }
Tramite questo operatore è possibile accedere ad una variabile tramite una stringa che ne contenga il nome, ad esempio la variabile “foo” potrà essere letta e/o scritta tramite la direttiva
$"foo" = 123
o
b = $"foo"
Una nota particolare va fatta sugli argomenti della linea di comando che sfruttano proprio questo operatore, essendo utilizzabili tramite le pseudo variabili $0, $1, $2, ecc ecc dove $0 contiene il nome dello script in esecuzione ed i valori successivi i suoi argomenti nel caso esistano.
L'operatore @ serve per ottenere un array contenente i valori1) delle variabili attualmente definite sullo stack, questo aspetto può tornare utile nel caso di funzioni che sfruttano la direttiva … e di conseguenza non sanno a priori quanti e quali argomenti riceveranno, ad esempio :
function foo( ... ){ foreach( argomento of @ ){ println( argomento ); } } foo( 1, 0.2, "bar", "moo" );
Stamperà
1 0.200000 bar moo
L'operatore explode, considerato un costrutto ibrido, serve per copiare gli elementi di un array o comunque di un oggetto iterabile all'interno di variabili distinte, la sua sintassi è :
( /* lista variabili */ ) = /* array o oggetto iterabile */;
Ad esempio :
foo = [ 1, 2, "moo", "bar" ]; ( a, b, c, d ) = foo;
In questo caso, le variabili a, b, c e d verranno definite ed impostate con i quattro elementi dell'array 'foo'. Alternativamente, se non si desidera prelevare tutti gli elementi dall'array, si possono specificare meno variabili :
foo = [ 1, 2, "moo", "bar" ]; ( a, b ) = foo;
L'operatore backtick, costituito dal carattere `, serve per eseguire un comando shell costituito da un espressione all'interno di due di questi apici ed a restituirne l'output in una stringa, ad esempio :
println( `"whoami"`.trim() );
nome-utente
Oppure
file = "file.txt"; println( `"cat " + file`.trim() );
... contenuto del file ...