Pr-Tech
 

Google Pr-Tech
Punime Artikuj tė Shkurtėr Mėsime Praktike

 

Kategoritė e Punimeve

Programim / KoncepteHarduer / StandardeSigurim / KriptologjiSisteme OperativeRrjeta / TelekomunikimHapėsirė / ShkencėAplikacione SistemorePolitikė / Kulturė / BiznesMbulime EkskluziveLibra Digjital

Programim ne Perl #02
Programim / Koncepte - 05/06/2004 - Shkruar nga: Genc B. KASTRATI - genc.kastrati ET pr-tech PIKĖ net
Pėr shtypės

Koment:, Pjesa e dytë e Perl serisë së shkrimeve do të mbulon Listat dhe Arrays, Qasja në Arrays, Indekset Speciale për Arrays, Literalet e Listave, Operatoret pop dhe push, Operatoret shift dhe unshift dhe Operatorin reverse.
Listat dhe Arrays

Pra siq e pamë në Perl01 scalar në Perl do të thotë njejës. Kur dëshirojmë të themi shumës në Perl atëhërë përdorim lists dhe arrays.

Lista është një grup i renditur i skalarëve. Ndërsa array është variabla që përmbanë listen. Në Perl këto zakonisht përdoren sikur të jenë të njejta, por kjo nuk është e vërtet. Lista është data apo shënimi ndërsa array është variabla. Mund të ekzistojnë listat që nuk janë array por çdo array përmbanë një listë.

Brenda, array është i përbërë nga vlerat skalare. Pra array përbëhet prej variablave skalare të cilat kanë vlera skalare. Këto vlera janë të renditura (jo përnga përmbajtja, megjithse kjo është e mundur) por përnga index-i. Pra çdo variabël brenda array-it e ka pozitën e vet e cila caktohet përmes indexit të saj. Indexi në Perl (sikur në PHP, C/C++ dhe Java) fillon nga numri 0. Mbasi që çdo variabël brenda array-it është variabel e pavarur skalare array mund të pëmbanë stringje, numra, vlerën undef apo ndonjë përzirje të veçantë. Megjithëse në jetën e përditëshme zakonisht array-i është i mbushur me vlera të tipit të njejtë.

Qasja në Arrays

Madhësia e array varët nga memoria. Array më i madh i mundur është aq sa lejon memoria e lirë në kompjuter. Ndërsa array më i vogël është ai që nuk përmbanë asnjë vlerë skalare. Më lartë përmendëm index-in. Vijojne disa shembuj se si përdoret ky index për qasjen e vlerave brenda array-it:

$qytetet_e_kosoves[0] = "Peja";
$qytetet_e_kosoves[1] = "Skenderaj";
$qytetet_e_kosoves[2] = "Ferizaj";

Pra vlera brenda kllapave të mëdha ([ dhe ]) quhet index. Vlen të mbajmë në mend që emri i një array mund të jetë njejtë sikur emri i ndonjë variable skalare tjetër, p.sh. Në rastin e lartë përmendur mund të kemi një array @qytetet_e_kosoves dhe një skalar $qytetet_e_kosoves. Pra e para është array ndërsa e dyta është variabël e veçantë që ska asgjë të bëjë me array. Megjithëse kjo është e mundur nuk është mirë të bëhet për arsye se më vonë programeri mund të humbet dhe mos kupton kodin.

Vlerat brenda variablave mund t'i manipulojmë në të njejtën mënyrë sikur variablat e veçanta:

print $qytetet_e_kosoves[0];           #shtype "Peja"
$qytetet_e_kosoves[0] = "Prizren";     #vlera behet "Prizren"
print $qytetet_e_kosoves[0];           #shtype "Prizren"
$qytetet_e_kosoves[0] .="i";           #vlera "i" i SHTOHET "Prizren"
print $qytetet_e_kosoves[0];           #shtypet "Prizreni"

Indexi është numër i plotë. Indexi me vlerë 2.5 ose çka do me pikë dhjetore nuk ka kuptime. Perl lejon (pra nuk e bon punë të madh) përdorimin e vlerave të jo-plota për caktimin e indexit. Ēka Perl bën në prapavijë është që e rrethon këtë numër:

$indexi = 2.546;
print $qytetet_e_kosoves[indexi];       #shtype "Ferizaj"
print $qytetet_e_kosoves[indexi – 1];   #shtype "Skenderaj"

Pra më lartë numri 2.546 është rrethu dhe u bë 2. Indexet si çdo numër tjetër në Perl mund të ndahen për të lexuar më lehtë me nën-vijen '_'. Pra $qytetet_e_kosoves[23_540] do të jete në rregull. Nëse tentoni me e shtypë në ekran vlerën e array variables që e shkruam më parë (me index 23540) atëherë do të fitojmë undef vlerën. Kjo është për arsye se vlera e variablës nuk është caktu asnjëherë.

Index-et Speciale për Arrays

Nëse shtojmë ndonjë vlerë në fund të array-it, ky do të rritet automatikisht. Array nuk ka kufizime (sikur në C/C++):

$prodhimet[0] = "molla";
$prodhimet[1] = "dardha";
$prodhimet[2] = "qershia";
$prodhimet[99] = "kumbulla";

Array-i lartë tani i ka 100 elemente (numërohet edhe '0'). Prej tyre 4 kanë vlerën e caktuar (prej 0 deri me 2, dhe 99) ndërsa 96 kanë vlerën undef.

Kur kemi nevojë të zbulojmë se cili element është i fundit në array athërë përdorim $#prodhimet. Simboli '#' në mes të '$' dhe emrit të array-it e tregon indexin e elementit të fundit. Ja disa shembuj të përdorimit të saj:

$fundi = $#prodhimet;           #tregon indexin e elementit te fundit
$sa_prodhime = $fundi + 1       #tregon numrin total te elementeve, + zero
$#prodhimet = 2;                #cakton fundin 2. Madhesia e array eshte 0 - 2
$#prodhimet = 99;               #cakton fundin 99. Vlerat e vjetra jane humb

Gjithashtu është e mundur të përdorim vlerat negative në index. Kur caktojmë ndonjë vlerë negative athërë indexi zbritet prej fundit. Pra $prodhimet[-1] do të thotë $prodhimet[99], $prodhimet[-100] do të thotë $prodhimet[0];. E di që po mendoni, po na e shkruam -1 dhe prap del elementi i fundit 99? Kjo është sepse vlera -1 në të vërtetë është elementi i fundit. Kjo nuk është sikur se zbritja e indexit më të madh me vleren -1, kjo është vetëm index-imi i elementeve nga fundi i array. Pra nuk është sikur 99 – 1 = 98. Në të vërtetë është -1 = elementi i fundit, -2 = elementi i parafundit.

Literalet e Listave

Literal i listës është mënyra se si e shpreh listën. Zakonisht në Perl këto janë vlerat e ndara përmes presjes ',' dhe të mbyllura me kllapa:

(1, 2, 3)             #lista ka 3 vlera 1, 2 dhe 3
(1, 2, 3,)            #njejt si e para, presja ne fund injorohet
("emri", 3.4)         #liste me 2 vjera
()                    #liste e zbrazet, undef
(1..200)              #liste me 100 numra, range-operatori '..'

Range-operatorin e kemi përmend në listën e operatoreve në Perl 01. Ja disa shembuj të përdorimit:

(1..5)           #vlerat prej 1 deri me 5
(1.3..5.7)       #njejt sikur e para, pika dhjetore injorohet, rrethon nr.
(5..1)           #liste e zbrazet, nuk bene nga me e madhe ne te vogel
(0,2..6, 8, 10)  #njejt sikur 0, 2, 3, 4, 5, 6, 8, 10
($a..$b)         #prej vleres se $a deri me $b

Lista mund të këtë çfarë do vlere skalare. Për shembull ($a + $b, $c + $d) do të ketë dy vlera skalare që janë të përbëra prej vlerave të mbledhura. Disa shembuj të listave me vlera të ndryshme:

(1,2, 3, "Mocarti", "Bahu", $pi)
("molla", "dardha", "pjeshka", "qershia")

Siduket programeret në Perl shpesh herë kanë nevojë për lista të fjaleve. Për këtë arsye është kriju shkurtesa qw që do të thotë "quoted words" ose "quoted by whitespace". Ja një shembull se si krijojme listen e fundit me lartë duke përdor qw:

qw/ molla dardha pjeshka qershia /

Kjo më lartë trajtohet sikur string i kufizuar me thonjëza-njëshe. Pra përdorimi i 'n\' nuk është i mundur, kjo përkthehet sikur pjesë e fjalës. Në qw kemi mundësi të përdorim edhe simbole tjera përveç '/' për të caktuar se ku qw mbaron, ja disa shembuj:

qw! molla dardha pjeshka qershia !
qw# molla dardha pjeshka qershia #      #PO njejt sikur komentet!!!!! :)
qw( molla dardha pjeshka qershia )
qw{ molla dardha pjeshka qershia }
qw[ molla dardha pjeshka qershia ]
qw< molla dardha pjeshka qershia >

Pse pytni? Ēka nëse simboli '/' është pjesë e ndonjë elementi që doni t'a vendosni në listë? P.sh. Ēka nëse dëshiroj të krijoj listën e pikave mount në Linux? Kjo më poshtë nuk funksionon:

qw/ /usr /tmp /var /home /

Pra mundësia e përdorimit të elementeve të ndryshme n'a lejon që kjo listë më lartë të jetë e mundshme:

qw! /usr /tmp /var /home !   #pra njejt me (/usr, /tmp, /var, /home)

Ēka nëse dëshirojmë të përdorim ndonjë simbol që është brenda elementit të listës? P.sh. Yahoo!?

qw! yahoo! google excite lycos !   #pra me '' mundemi te permbajme '!'

Shkurtë Perl i ka disa sende si mundësia që një gjë të bëhet në më shumë se një mënyrë. Tjetër gjë që Perl e ka, do t'a shohm më vonë, është që kllapat mund të largohen nëse nuk e ndryshojnë kodin. Kjo është përmend edhe më herët.

Caktimi i Vlerave të Listave

Vlerat e variablave brenda listave bëhen shumë ngjajshëm me variablat e zakonshme. Shembull:

($para, $dyta, $treta) = ("google", "yahoo", undef);

Perl n'a lejon shumë liri me lista. Shembulli i më poshtëm i shkëmben vlerat e $para dhe $dyta:

($para, $dyta) = ($dyta, $para);
($testi[0], $testi[1]) = ($testi[1], $testi[0]);   #nese jane arrayet

Ēka ndodhë nëse listës i caktohen më shumë vlera sesa që ka variabla? Atëherë vlerat e teperta injorohen, shembull:

($path_usr, $path_tmp) = qw! /usr /tmp /var /home !

Pra /var dhe /home janë injoruar. Këto vlera nuk janë caktu asnjë variables.
Ēa ndodhë nëse ka më shumë variabla sesa vlera të caktuara? Atëherë Perl variablave të pacaktuara i'u jep vleren undef, shembull:

($path_usr, $path_tmp) = qw[ /usr ]   #$path_tmp eshte undef

Metodat e më larta mund të përdoren për caktimin e vlerave brenda array-ave gjithashtu!

($path[0], $path[1], $path[2], $path[3]) = qw{ /usr /tmp /var /home }

Perl thjeshton caktimin e vlerave të array ashtu që nuk kemi nevojë të përmendim çdo index:

@path = qw( /usr /tmp /var /home );

Ndoshta e keni vërejtë një gjë, skalaret fillojnë me $ sikur $calar, ndërsa array fillojnë me @ sikur @rray. Këtë e ka zgjedhe Larry Wall (krijuesi i Perl) me qëllim ;)

Ja disa shembuj se si është marrëdhënia mes array me '@':

@vogel = ();                           #array i zbrazet
@madhe = 1..1e5;                       #array me 100,000 elemente
@dicka = (@madhe, undef, @madhe);      #array me 200,001 elemente
$emri = "Pr-Tech";            
@edhenje = (@path, "Prishtina", @vogel, $emri);

Kjo e fundit do të ketë 4 elemente nga @path, 1 nga "Prishtina", 0 nga @vogel dhe 1 nga $emri. Pra po e vëreni se numri total i elementeve është 6 e jo 7. Pra @vogel nuk e shton undef. Kjo është sepse kur e caktojmë array në mënyrë që e kemi caktuar @vogel atëherë edhe pse është undef nuk e mbartë këtë vlerë.

Kopjimi i array-it në array bëhet me:

@kopia = @path;

Ēka ndodhë me lartë është që kopjohet lista e variablave që gjindet brenda array-it. Mos haroni që array është variabla që gjithmon përmbanë listen.

Operatoret pop dhe push

Ėshtë e mundur të shtojmë elemente në array duke e shtuar indexin e fundit për një. Por Perl lejon përdorimin e disa operatoreve që e bëjnë këtë me lëhtë (dhe më pastër). Dy operatorë të cilët lejojnë shtimin dhe largimin e elementeve nga fundi i array (nga ana e djathtë) janë pop dhe push. P.sh:

@arrayi = 4..9;             #krijon array me 5 elemente
$numri = pop(@arrayi);      #vlera e $numri tani eshte 9
$numri = pop @arrayi;       #vlera e $numri tani eshte 8
pop @arrayi;                #arrayi tani e ka humb 7, 7 nuk vendoset askund

Kur arrayi është i zbrazet, pop operatori nuk e ndron. Nuk ndodhë asgjë. Pra Perl lejon largimin e kllapave kur ato nuk ndyshojnë asgjë, për shembull më lartë pop operatori është përdorë dy hërë në arrayin @arrayi, në rastin e dytë kllapat nuk ishin prezente, rezultati ishte i njejtë.

Operatori push e bënë të kundertën, pra ky shton vlera në fund të arrayit:

push(@arrayi, 4);           #arrayi tani ka elementet, 4, 5, 6 dhe 4
push @arrayi, 2;            #tash ka, 4, 5, 6, 4 dhe 2
push @arrayi, 1..4;         #ka 4, 5, 6, 4, 2, 1, 2, 3 dhe 4
@tjeret = qw/ 3 4 1 5 /;   
push(@arrayi, @tjeret);     #ka gjitha nalt dhe 3, 4, 1, 5

Pra në fund @arrayi ka elementet 4, 5, 6, 4, 2, 1, 2, 3, 4, 3, 4, 1 dhe 5.

Operatoret shift dhe unshift

Operatoret push dhe pop përdoren për fundin e arrayit. Nëse dëshirojmë të shtojme apo largojmë elemente nga fillimi (ana e majte) e arrayit atëherë përdoren operatoret shift dhe unshift:

@arrayi = qw# nje dy tre  #;      #arrayin me 4 elemente, nje, dy dhe tre
$a = shift(@arrayi);              #tani arrayi ka elemntet dy the tre
$b = shift(@arrayi);              #tani arrayi ka elementin tre
shift @arrayi;                    #arrayi tash eshte i zbrazet
$c = shift(@arrayi);              #vlera e $c eshte undef
unshift(@arrayi, 5);              #tash arrayi ka listen me 1 element, 5
unshift(@arrayi, 4);              #tash arrayi ka 4 dhe 5. pra 2 elemente
@meshume = 1..3;
unshift @arrayi, @meshume;        #tash ka 1, 2, 3, 4 dhe 5

Vëreni drejtimin e levizjes se vlerave, nga e majta në të djathtë.

Përzirja e Array-ve në Stringje

Sikur skalaret edhe array-s mund të përzihen me thonjëza dyshe. Elementet e array-it ndahen automatikisht me hapesira (Në realitet vlera e ndarësit (pra hapesires) vjen nga variabla $", zakonisht hapësirë. Kjo është në brendësi të Perl kështu që programeri ska nevojë të mban në mend) p.sh.:

@elementet = qw{ buke qumshte uje };
print "Ushqimi i soten eshte @elementet, keto jane.n";

Keni kujdes kur shtypni adresa të e-postës në Perl. Perl tregon error të kompilimit nëse simboli '@' gjindet në mes të thonjëzave dyfishe. Për të shtypur adresën e saktë përdoren këto dy mënyra:

@email = "NOSPAM@pr-tech.net";   #me thonjeza dyshe
@email = 'NOSPAM@pr-tech.net';   #me thonjeza njeshe

Indexet në arrayet e Perl përkthehen sikur ekuacione, pra $elementi[$y – 3], nese $y = 3. eshte $elementi[0].

Levizja Neper Array-et

Perl n'a mundëson të shofim gjitha elementet duke e përdorë foreach strukturen kontrolluese.

foreach $numeruesi(qw/ buke qumshte uje/){
   print "Ushqimi i pare eshte: $numruesin";
}

Variabla kontrolluese $numeruesi ndron vlerën me çdo përseritje të foreach. Variabla kontrolluese nuk është kopia e elementit në listë por vet elementi. Nëse e ndryshojmë këtë atëherë e ndryshojmë edhe elementin në listë.

@elementet = qw/ buke qumshte uje /;

foreach $numeruesi (@elementet){
   $numeruesi = "t$numeruesi";     #shto nje TAB perpara elementit
   $numeruesi .= "n";              #shto nje NEW LINE pas elementit
}

print "Elementet ne array jane: n", @elementet

Default në Perl: $_

Nëse nuk e shkruan variablen kontrolluese në foreach atëherë Perl përdorë variablën e përgjithshme $_.

foreach (1..10){
   print "Te numerojme... $_!n";
}

Kjo variabël nuk është e vetmja variabël e përgjithshme në Perl. Ekzistojnë shumë të tjera por kjo përdoret më së shumti.

Operatori reverse

Me këtë operator mundemi të kthejmë gjitha vlerat në array:

@numrat = 1..10;
@mbrapa = reverse(@numrat);
@numrat = reverse(20..100);
@numrat = reverse(@mbrapa);

Operatori sort

Ky operator bën renditjen e elementeve në array. Renditja është sipas ASCII kodeve. Pra 100 vjen përpara 99. Pra shembulli i mëposhtëm tregon që ASCII renditja nuk do të thotë renditja logjike që ne njerëzit e kemi zakon t'a bëjmë:

@numrat = sort 97...102;              #krijon listen e renditur qe fillon prej 100, 101, 102, 97, 98, 99

Mos haroni që nëse doni t'a renditni një array atë duheni t'a bëni kështu:

@numrat = sort @numrat;

Formati i meposhtem nuk funksionon:

sort @numrat;


Burimet e Perdorura:

Schwartz, Randal dhe Phoenix, Tom. Learning Perl 3rd Edition. Sebastopol: O'Reilly & Associates, 2001.


Creative Commons License
Ky material ėshtė i lėshuar nėn licensėn
Creative Commons (Attribution-ShareAlike) qė do tė thotė qė materiali mund tė kopjohet, shpėrndahet, ekspozohet, pėrdoret pėr punime rrjedhėse dhe nevoja komerciale pėrderisa: Ceket autori; Nė rast ndryshimi, lėshohet nėn po tė njejtat kushte. Autori/ja i/e kėtij materiali pajtohet automatikisht qė materiali tė lėshohet nėn kėtė licensė. Kushtet mund tė largohen vetėm me lejėn e autorit/es.
Mbi Pr-Tech | Kontaktet Copyright Pr-Tech® 2004 - 2010 Thanks to all that inspired, taught and helped push us forward...