Minun mielestäni esimerkki on jonkinverran käyttökelpoinen yksinäänkin, mutta teoria on vahingollinen ilman esimerkkiä eli sovellusohjetta.
Atomic-group:ista ei esitetä missään kunnollista esimerkkiä mutta kelvottomia esimerkkejä runsaasti. Kunnon esimerkillä tarkoitan sellaista esimerkkiä josta selviää se jokapaikassa väitetty nopeutus edes jotenkin samoinkuin katastrofeilta suojaava ominaisuus. Yhden hölmön esimerkin löysin regex-info sivuilta - tosin kokonaisuuteen piti hakea palasia monesta paikasta. Lisäksi tämä selvittää vasta katastrofeilta suojaamista:
echo '< kakkularatsis ja hilipata hoi >' | grep -Po '(\D+|<\d+>)*[!?]' # tämä kestää minun koneessani noin 60-100ms ja päätyy virheeseen.
echo '< kakkularatsis ja hilipata hoi >' | grep -Po '((?>\D+)|<\d+>)*[!?]' # atomic-group:illa varustettuna sama kestää noin 4ms, ei pääty virheeseen muttei tulostakaan mitään
echo '< kakkularatsis ja hilipata hoi >?' | grep -Po '((?>\D+)|<\d+>)*[!?]' # tämä kestää saman noin 4ms ja tulostaa: ?
- atomic-group on tuo kahdessa viimeisessä esimerkissä oleva: (?>\D+) .
**
atomic-group:in nopeutuksesta osaan esittää vain yhden täysin mielipuolisen esimerkin:
echo 'kymmenentuhatta a-kirjainta peräkkäin' | grep -P '(?>a*)' > /dev/null # tämän pitäisi olla se nopeampi ja kyllähän se hieman onkin
echo 'kymmenentuhatta a-kirjainta peräkkäin' | grep -P 'a*' > /dev/null
- muissa esimerkeissä pilasin yhden kovalevyn miljoonilla toistoilla (esimerkiksi suoritusajan keskiarvon saamiseksi) ja tuloksena oli vain epäilys että atomic-group yleensä päinvastoin kuluttaa aikaa.
**
Atomic-group:in tarkoituksena on, että valitaan käyttöön joko yksinkertainen- tai monimutkainen regex siten, että monimutkainen ei saa alkaa samallatavoin kuin yksinkertainen -> "hienommin" sanottuna estetään backtracking.
Mikäli regex:ät muodostetaan käsin koodaamalla on atomic-group:in käyttäminen hölmöä, joten seuraavissa esimerkeissä ei sinällään ole järkeä. Atomic-group:in käyttökelpoisuus perustuukin siihen että pätevämmissä hyötyohjelmissa regex:ät muodostetaan muuttujilla.
- ehkä tuo väite että regex:ät voidaan muodostaa muuttujilla kaipaa sekin osoitusta: regex="[0-9]"; echo "9 aaa b" | grep -o "$regex" # tulostaa: 9
Seuraavat esimerkit kertovat atomic-group:in toiminnan koodina:
echo accc | grep -Po 'a(?>b|cc)c' # tulostaa: accc -> siis ?>b:llä ei ole mitään funktiota koska "echo:tussa" ei b:tä ole.
echo abcc | grep -Po 'a(?>b|bc)c' # tulostaa: abc -> siis ?>b määrää ettei muita vaihtoehtoja koeteta kun b löytyy
echo abccc | grep -Po 'a(?>b|cc)c' # tulostaa: abc -> siis ?>b määrää ettei muita vaihtoehtoja koeteta kun b löytyy (varmistus)
echo abac | grep -Po 'a(?>bb|ba)c' # tulostaa: abac -> siis ?>bb määrää, että bb-alkuiset on lukittu mutta kaikki muut toimii kyllä, vaikka ba:kin toimii.
echo abc | grep -Po 'a(?>bb|b)c' # tulostaa: abc -> siis ?>bb määrää, että bb-alkuiset on lukittu mutta kaikki muut toimii kyllä, vaikka b:kin toimii.
echo abbac | grep -Po 'a(?>bb|bba)c' # ei tulosta mitään, koska ?>bb määrää, ettei bb-alkuisten regex:ät eivät voi saada muita arvoja.
**
Atomic tarkoittaa: jakamaton eikä sitä voi muuttaa kun se on kerran tehty.
Kun BASH:issa atomic liitetään ryhmään ei koko ryhmässä voi muuttaa mitään niin kauan kuin atomic on joukossa.