ohjeita web-sivuston tekijälle
Perlin yksi käyttökelpoisimmista, ellei kaikkein käyttökelpoisin ominaisuus on sen monipuoliset mahdollisuudet merkkijonojen käsittelyyn. Tämän mahdollistavat nk. säännölliset ilmaukset (regular expressions), joita käytetään myös monissa muissa ohjelmointikielissä ja ohjelmissa.
Haettava merkkijono sijoitetaan kauttaviivojen ( / ) väliin ja haun suorittamiseen käytetään =~ operaattoria. Seuraava lauseke saa arvon tosi jos sana "the" esiintyy muuttujassa $sentence.
$sentence =~ /the/
Ilmauksessa pienillä ja suurilla merkeillä on eroa, joten jos
$sentence = "The quick brown fox";
edellinen lauseke saisi arvon epätosi. Operaattoria !~ käytetään kääntämään haun tulos. Edellinen esimerkki:
$sentence !~ /the/
saisi arvon tosi koska sanaa "the" ei esiinny muuttujan arvossa.
Voisimme käyttää ehtolauseketta
if ($sentence =~ /under/)
{
print "We're talking about rugby\n";
}
joka tulostaisi viestin jos muuttujan arvo olisi esim. jompi kumpi seuraavista:
$sentence = "Up and under"; $sentence = "Best winkles in Sunderland";
Usein on kuitenkin paljon helpompaa jos yhdistämme lauseet skalaarimuuttujaan $_. Jos menetellään tällä tavalla ei tarvitse käyttää hakuoperaattoreita ja edellinen voidaan kirjoittaa yksinkertaisesti:
if (/under/)
{
print "We're talking about rugby\n";
}
$_ muuttuja on Perlin oletusarvo useiden operaatioiden yhteydessä ja sitä käytetään usein.
Regular Expression: ssa on runsaasti erikoismerkkejä, jotka tekevät niistä sekä erityisen käteviä että saavat ne vaikuttamaan täysin käsittämättömiltä. Seuraavassa joitakin RE merkkejä ja niiden merkitys
. mikä tahansa yksittäinen merkki paitsi rivinvaihto ^ rivin tai merkkijonon alku $ rivin tai merkkijonon lopu * nolla tai useampi edellistä merkkiä + yksi tai useampi edellistä merkkiä ? nolla tai yksi edellistä merkkiä
ja seuraavasssa joitakin esimerkkejä:
t.e t, mikä tahansa merkki paitsi rivinvaihto ja e.
hyväksyttäviä merkkijonoja: the, tre, tle mutta ei te, tale
^f f rivin alussa
^ftp ftp rivin alussa
e$ e rivin lopussa
tle$ tle rivin lopussa
und* un jonka perässä nolla tai iseampi d.
esim.: un, und, undd, unddd jne.
.* mikä tahansa merkkijono, jossa ei ole rivinvaihtomerkkiä.
hyväksyy kaikki muut merkit paitsi rivinvaihdot ja *
hyväksyy nolla tai useamman edelistä merkkiä, tässä
tapauksessa siis mitä tahansa merkkiä paitsi rivinvaihtoa.
^$ tyhjä rivi
Vaihtoehtoja on enemmänkin. Hakasulkeita käytetään antamaan vaihtoehtoisia hyväksyttäviä merkkejä. Niiden sisällä - tarkoittaa väliä ja ^ negaatiota:
[qjk] q, j tai k
[^qjk] ei mikään kirjaimista q, j ja k
[a-z] mikä tahansa merkki väliltä a-z
[^a-z] ei pieniä kirjaimia
[a-zA-Z] mikä tahansa kirjain
[a-z]+ mikä tahansa ei tyhjä pienillä kirjaimilla
kirjoitettu merkkijono
| tarkoittaa loogista operaattoria "or" ja
sulkuja voidaan käyttää ryhmittelyyn:
jelly|cream joko jelly tai cream
(eg|le)gs joko eggs tai legs
(da)+ joko da tai dada tai dadada tai...
lisää erikoismerkkejä:
\n rivinvaihto \t sarkain \w mikä tahansa alphanumeerinen merkki. Sama kuin [a-zA-Z0-9_] \W ei mikään alphanumeerinen merkki. Sama kuin [^a-zA-Z0-9_] \d mikä tahansa numero. Sama kuin [0-9] \D ei mikään numero. Sama kuin [^0-9] \s mikä tahansa tyhjä merkki: välilyönti, sarkain ,rivinvaihto jne. \S edellisen negaatio \b sanaväli, vain hakasulkeiden ulkopuolella \B ei sanaväliä
Selvästikin merkit kuten $, |, [, ), \, / jne. Ovat erikoistapauksia. Jos nitä halutaan käyttäää matchingissa niiden eteen täytyy laittaa kenoviiva:
\| or-merkki \[ hakasulut auki \) sulut kiinni \* asteriski \^ karaattimerkki \/ kauttaviiva \\ kenoviiva
Esimerkkejä regular expression: ista. Matchingissa käyttöä varten ne täytyy sijoittaa kauttaviivojen väliin.
[01] joko "0" tai "1"
\/0A jako nollalla: "/0"
\/ 0A jako nollalla, kauttaviivan ja nollan
välissä välilyönti: "/ 0"
\/\s0A jako nollalla, kauttaviivan ja nollan
välissä tyhjä merkki ( esim. Sarkain ): "/ 0"
\/ *0A jako nollalla, mahdollisesti välilyöntejä välissä:
"/0" or "/ 0" tai "/ 0" jne.
\/\s*0A jako nollalla, mahdollisesti tyhjiä merkkejä.
\/\s*0\.0* kuten edellä, mutta desimaalipiste ja mahdollisesti nollia
sen perässä: "/0.", "/0.0", "/0.00" jne.
ja "/ 0.", "/ 0.0", "/ 0.00" jne.
Matchingin ohella Perl osaa korvata merkkijonoja toisilla. Tämä tapahtuu s-funktion avulla. Jälleen käytetään match operaattoria ja jos match löytyy korvaus suoritetaan $_ muttujan avulla.
Teksti london korvataan tesktillä London $sentence-muuttujasta komennolla:
$sentence =~ s/london/London/
ja sama $_ -muuttujan avulla:
s/london/London/
Tämän lausekkeen tulos on tehtyjen korvausten lukumärää, siis jo 0 (false) tai 1 (true) tässä tapauksessa.
Haluttaessa korvata kaikki merkkijonon esiintymiset samaan tapaan kuin tekstinkäsittelyohjelmien komento Replace all kirjoitetaan seuraavasti:
s/london/London/g
joka toimii muuttujan $_ avulla. Jälleen lauseke palauttaa tehtyjen korvausten lukumäärän. Haluttaessa korvata myös lOndon, lonDON, LoNDoN jne voidaan kirjoittaa:
s/[Ll][Oo][Nn][Dd][Oo][Nn]/London/g
mutta helpommalla pääsee käyttämällä parametria i (ignore case).
s/london/London/gi
Optio i on käytössä myös normaalissa regular expression match: ssä.
Usein on hyödyllistä muitsaa tehdyt match: it, jolloin niitä voidaan käyttää uudestaan. Kaikki sulkuihin sijoitetut matching: it talletetaan muuttujiin $1,...,$9. Näitä merkkijonoja voidaan käyttää samassa regular expression: ssa ( tai korvauksessa ) käyttämällä RE koodeja \1,...,\9. Esimerkiksi:
$_ = "Lord Whopper of Fibbing"; s/([A-Z])/:\1:/g; print "$_\n";
korvaa jokaisen suurella kirjoitetun kirjaimen kaksoispisteiden väliin sijoitetulla merkillä. Tämä tulostaa :L:ord :W:hopper of :F:ibbing. Muuttujat $1,...,$9 ovat nk. read-only muuttujia; niille ei voi itse antaa arvoa.
Toinen esimerkki
if (/(\b.+\b) \1/)
{
print "Found $1 repeated\n";
}
Tarkistaa toistetaanko mitään sanaa. Jokainen \b tarkoittaa sanaväliä ja .+ matchaa minkä tahansa ei-tyhjän merkkijonon, joten \b.+\b matchaa minkä tahansa sanan. Tämä asetetaan sitten muistiin sulkeiden avulla ja talletetaan muuttujaan $1 merkinnän \1 avulla.
Seuraava vaihtaa rivin ensimmäisen ja viimeisen merkin muuttujaan $_:
s/^(.)(.*)(.)$/\3\2\1/
Merkit ^ ja $ matchaavat rivin alun ja lopun. Koodi \1 tallentaa rivin alun ja koodi \2 kaiken muun piatsi viimeisen merkin, joka talletetaan koodilla \3. Sitten koko rivi korvataan siten ,että \1 ja \3 vaihtavat paikkaa.
Match: n jälkeen voidaan käyttää read-only muuttujia $`, $& ja $' löytämään aiemmin tehdyt korvaukset, joten:
$_ = "Lord Whopper of Fibbing"; /pp/;
kaikki seuraavat saavat arvon true.
$` eq "Lord Wo"; $& eq "pp"; $' eq "er of Fibbing";
Kannattaa muistaa, että kauttaviivojen sisällä muuttujat interpoloidaan joten:
$search = "the";s/$search/xxx/g;
korvaa sanan "the" joka kerta merkkijonolla "xxx". Haluttaessa korvata sana "there" jokainen esiintyminen ei voida kirjoittaa s/$searchre/xxx/ koska tämä interpoloidaan muuttujaksi $searchre. Sen sijaan muuttujan nimi tulee sijoittaa aaltosulkeisiin:
$search = "the";
s/${search}re/xxx/;
Seuraava sivu: Kääntäminen.
Mitenkäs jos halutaan etsiä muuttujasta vaikkapa
4R tai 6H tai 99 tai ED. Eli miten haku tapahtuu jos muutujassa voi olla sekä numeroita että kirjaimia ja sitä sitten verrataan edellä mainittuihin arvoihin?
Onpas vaikeata kieltä, mutta kuitenki tarpeelista.
18.10.2006 15:22[01] joko "0" tai "1"
\/0A jako nollalla: "/0"
\/ 0A jako nollalla, kauttaviivan ja nollan
välissä välilyönti: "/ 0"
\/\s0A jako nollalla, kauttaviivan ja nollan
välissä tyhjä merkki ( esim. Sarkain ): "/ 0"
\/ *0A jako nollalla, mahdollisesti välilyöntejä välissä:
"/0" or "/ 0" tai "/ 0" jne.
\/\s*0A jako nollalla, mahdollisesti tyhjiä merkkejä.
\/\s*0\.0* kuten edellä, mutta desimaalipiste ja mahdollisesti nollia
sen perässä: "/0.", "/0.0", "/0.00" jne.
ja "/ 0.", "/ 0.0", "/ 0.00" jne.
MIELESTÄNI EDELLÄ EI OLE SELOSTETTU ISON A:N
KÄYTTÖÄ?
Muisti
Usein on hyödyllistä muitsaa tehdyt match: it, jolloin ^
|
PITÄISI OLLA muistaa