Html dersleri
Bu notlar tamamen dilovası çok programlı lisesinin bilgisayar bölümü öğretmenlerinden Muharrem KARAKOÇ'a aittir BÖLÜM I
GİRİŞ
1.1.HTML NEDİR ?
HTML (HyperText Markup Language / Hareketli-Metin İşaretleme Dili) basitçe, browserlarla görebileceğimiz, internet dökümanları oluşturmaya yarayan bir çeşit dildir. Tanımda geçen "internet dökümanı" ifadesinin yanısıra HTML ile oluşturduğunuz belgeleri harddiskinize kaydedebilir ve internet bağlantınız olmasa bile bu belgeleri görüntüleyebilirsiniz. HTML, programlama dilleri (pascal, basic,..) gibi bir programlama mantığı taşımadığından öğrenilmesi gayet kolay bir dildir. Dilden ziyade kabaca metinleri ya da verileri biçimlendirmek, düzenlemek için kullandığımız komutlar dizisidir diyebiliriz.
1.2. HTML'DE TEMEL UNSURLAR
HTML nispeten kolay bir dildir. Bu dilde binary veya hexadecimal kodlar yok. Herşey metin tabanlı ve bir HTML dökümanı oluşturmak için ihtiyacınız olan şey bir editör. Hatta sizde herhangi bir HTML editörü bulunmuyorsa bu işi Windows'un notepad'i ile dahi halledebilirsiniz. Piyasada iki tip editör bulunuyor. Birisi metin tabanlı, kod yazmayı gerektiren fakat bunun yanısıra rutin bazı işlemleri kolaylaştıran editörler(HotDog, HomeSite..) diğeri WYSIWYG (What You See Is What You Get / Ne görürsen onu alırsın) tarzı denen kısaca görsel, kodlamayla uğraştırmayı gerektirmeyen editörler (FrontPage, Dreamweaver, NetObjects Fusion,..).
Burada şunu da belirtmek gerekiyor; browserlar arasındaki yorum farklarından dolayı sayfanız bir browser'da iyi görünürken bir başka browser'da hiç istemediğiniz bir şekilde görüntülenebilir. Hele yeni bazı teknikleri (css, dhtml gibi)sadece MS Internet Explorer 4 ve üstü desteklerken Netscape henüz bu teknikleri tam olarak desteklemiyor. Yine de piyasayı neredeyse yarı yarıya paylaşan bu iki browser'ın birbirlerine üstün olduğu yönleri var. Sonuçta, ne kadar fiyakalı bir sayfa da yapsanız elde ettiğiniz başarı sayfanızı ziyaret eden kişinin kullandığı browser'a mahkum. Hatta ziyaretçiniz browser'ına verdiği bir talimatla "yalnız şu fontu kullan", "grafikleri görüntüleme" şeklinde bir ayar yapmışsa sizin yapmış olduğunuz sayfa istediğiniz biçimde görüntülenmeyecektir. 1.3. İLK SAYFA
1. Öncelikle çalışmalarınızı saklamak için kullanacağınız boş bir klasör oluşturup uygun bir ad verin, mesela html_ders" olsun. Daha sonra bu ad bize lazım olacak.
2. Şimdi de bu klasörü açıp yeni bir "metin belgesi" oluşturun (sağ fare/Yeni/Metin belgesi).
3. Dosyayı çift tıklayarak açın ve şunları yazın:
İlk Sayfam
Sayfama Hoşgeldiniz
4. Şimdi dosyayı kaydedin (Dosya/Farklı Kaydet...). Dosya adı kısmına şöyle yazın: "sayfa1.htm" (tırnaklar dahil)ve Tamam'a basın.
5. Notepad'i kapatın, metin dosyasını silin ve oluşan yeni dosyayı açın. Dosya varsayılan browser'ınız (internet explorer, netscape navigator gibi)tarafından açılacaktır. Şöyle bir görüntü elde edeceksiniz.
Şekil 1.3.1: Internet Explorer görünümü
Şekil 1.3.2: Netscape browser görünümü Böylece ilk HTML sayfamızı yapmış olduk. Şimdi de bu belgeyi nasıl oluşturduğumuzu birlikte inceleyelim. Kelimeleri küçük "<" ve büyük ">" sembolleri arasına yazıyoruz. Bu ifadelere tag (etiket) deniyor. Etiketler etki etmesi istenilen metnin önüne ve arkasına yazılıyor. Önce etiketi yazıyoruz, sonra metni yazıyoruz daha sonra aynı etiketi önüne bir bölü işaretiyle tekrar yazıyoruz. Bu son yaptığımız etiketi sonlandırıyor. Bir kaç istisna dışında tüm etiketler belge içerisinde sonlandırılmak zorunda. Burada kullandığımız etiketler ve anlamları şöyle: .... Tarayıcıya HTML dosyasının başladığını ve bittiğini belirtiyor. Diğer tüm kodlar bu iki etiket arasına yazılır. .... .... Bir HTML belgesi iki bölüme ayrılıyor: head(baş) ve body(gövde). .... etiketleri arasına sayfa hakkında bilgiler yazıyoruz. Meta ve title gibi etiketler burada yer alıyor. Meta etiketlerine ileride değineceğiz. .... arası ise sayfamızın gövde bölümü. Ekranda gösterilecek kısımlar bu tagler arasında yer alıyor Hazırladığımız sayfada dikkat ederseniz sadece temel etiketleri kullandık. Yani metin biçimlendirmeye yarayan hiçbir etiket kullanmadık. Bu yüzden .... arasına yazdığımız "Sayfama Hoşgeldiniz" yazısı browser'ın varsayılan metin ayarlarıyla gösteriliyor. Hiçbir kod yazmadan sadece "Sayfama Hoşgeldiniz" yazıp kaydetsek ve browser'da böyle görüntülesek de aynı neticeyi elde edecektik. 1.4. METİN BİÇİMLENDİRME Bu bölümde öğreneceğimiz etiketler: • Başlık etiketleri:...
• Paragraf etiketi:
...
• Ortalama :... • Diğer etiketler : ...,...,... HTML'de metin stillerini üç şekilde belirleyebiliriz: 1. Düzenlemek istediğimiz metnin hemen önüne koyacağımız bir etiketle biçimleme stili. Buna in-line (aynı satırda) biçimlendirme denir. 2. Sayfanın head (baş) kısmına koyulan stillere body (gövde) bölümden atıf yapılarak metin biçimleme. (Embedded-Gömülü biçimlendirme) 3. HTML dosyasının dışında başka bir stil dosyası oluşturarak til için bu dosyayı kullanma. Buna Cascading Style Sheets-Yığılmalı Stil Kağıtları deniyor. Kısaca CSS. Bu teknik bize örneğin yüzlerce sayfanın stilini tek bir stil dosyası ile belirleme gibi geniş imkanlar veriyor. Birinci metotta her metin için ayrı ayrı stil belirtirken ikinci ve üçüncü metodlarda stil bir defa belirleniyor ve bu stilleri istediğimiz metne uygulayabiliyoruz. Burada önemli olan bir diğer husus da ilk metodu tüm browserlar sorunsuz yorumlayabiliyor fakat 2. ve 3. metodu Internet Explorer ve Netscape'in son sürümleri (yorum farklılıkları ile beraber) destekliyorlar. Burada konumuz birinci metoda göre biçimlendirmeyi öğrenmek. Başlık etiketlerinden başlıyoruz. Notepad'i açıyor ve şunları yazıyoruz;Başlık Etiketleri Başlık 1
Başlık 2
Başlık 3
Başlık 4
Başlık 5
Başlık 6
Şekil 1.4.1: Başlık etiketleri 1 Sayfanın işleyişine baktığımızda, önce her zaman yapmamız gerektiği gibi html, head, title etiketlerini yerleştirdik. Sayfa başlığı (title) olarak "Başlık Etiketleri"ni seçtik ve sayfanın gövde (body) kısmına istediğimiz metinleri yazdık ve bu metinleri h1'den h6'ya kadar olan biçimlendirme etiketlerinin arasına aldık. Browser metin biçimleme etiketleri olan...
etiketleri arasındaki kelimelere belirli büyüklükler verdi. Diğer etiketleri toplu olarak kullanarak yeni bir HTML dosyası oluşturalım. Kodlar şu şekilde olsun:
Başlık Etiketleri-2
Sayfama Hoşgeldiniz HTML etiketleri ile,
Yazıları koyu italik ve altı çizili olarak yazabiliyorum Şekil 1.4.2: Başlık etiketleri2 Biçimlendirmek istediğimiz metnin başına ilgili etiketi yazıyoruz ve metnin sonunda da ilgili etiketi sonlandırıyoruz. Etiket biz sonlandırmadığımız müddetçe etkisini göstermeye devam ediyor. Örnekler üzerindeki kodların yerlerini değiştirerek kaydedin ve diğer taraftan browser'ınızın reload/yenile tuşuna basarak değişiklikleri gözlemleyin. Yeni öğrendiğimiz kodlara bir göz atalım:.... Aradaki metinleri sayfaya göre ortalar. center) .... Aradaki metni koyu (bold)yazar .... Aradaki metni eğik (italic) yazar. .... Aradaki metni altı çizili (underline) olarak yazar.....
Başlık (heading) etiketi. h1 en büyük, h6 en küçük.
....
Aradaki metin paragraf özelliği kazanır. Sonlandırıldığında, takip eden metin bir satır boşluk bırakılarak ve satır başına yazılır. 1.5. FONTLAR Font etiketinin kullanımı; face= yazı tipinin adı (arial, tahoma, verdana, ...) size= yazının büyüklüğü (1-7 arası) color= yazının rengi (red, green gibi renklerin ingilizce karşılığı yada RGB renk değeri) Bunlara font etiketinin parametreleri deniyor. etiketinin yanısıra öğreneceğimiz bir diğer etiket
etiketi. Önce bu etiketin kullanımını göreceğiz.
etiketi bir bakıma enter tuşunun görevini görüyor. Bunu biraz açıklayalım; HTML'de metinleri yazarken kullandığımız editörde bir alt satıra geçmek için enter tuşunu kullanırız. Fakat HTML dilinde bunun hiçbir anlamı yoktur, tüm kodları ve metinleri tek satırda dahi yazsanız browser açısından fark etmeyecektir. Bu yüzden metinleri bölmek, yani ikinci satıra atmak için
etiketini kullanıyoruz. İstisnai etiketlerden birisi bu,
etiketi sonlandırılmıyor. Buna bir örnek verelim;BR etiketi pazartesi salı çarşamba
ocak
şubat
mart
nisan Şekil 1.5.1: Fontlar Yukarıdaki örneğimizde "pazartesi, salı ve çarşamba"yı yazarken enter'la bir alt satıra geçmemize rağmen browser bunu gözönüne almayarak tüm metni bir satırda yazdı. Fakat ikinci sefer ay adlarını tek bir satıra yazdığımız halde bu kez browser aradaki
etiketine bakarak bir sonraki metni satır başına aldı. Buradan da anlaşıldığı üzere "enter" etkisini
etiketiyle veriyoruz. Bu etiketin bir özelliği de sonlandırılmaması. Şimdi font etiketinin kullanımını bir örnekle inceleyelim. Eğer kullanmak istediğiniz font bilgisayarınızda yüklü değilse font etiketi ile biçimlemek istediğiniz metin browser'ın varsayılan fontu ile gösterilecektir. Bu yüzden önce sisteminizde yüklü olan fontları inceleyin (Başlat/Ayarlar/Denetim Masası/Yazıtipleri). Buradan yazı tiplerini açarak inceleyebilir ve beğendiklerinizi kullanabilirsiniz.Renkler ve Mevsimler İlkbahar
Yaz
Sonbahar
Kış
1.6. LİSTELER HTML bize üç tip liste hazırlama imkanı veriyor. Bunlar; 1. Sıralı listeler (ordered list) 2. Sırasız listeler (unordered list) 3. Tanımlama listeleri (definition list) Sıralı listeler rakam veya harf yada her ikisini içiçe kullanarak liste oluşturmamızı, sırasız listeler rakam/harf yerine madde imleri koyarak liste oluşturmamızı sağlar. Tanımlama listeleri ise bir listeden çok kalabalık metinlerde okumayı kolaylaştırmaya yardımcı olabilecek bir araçtır. 1.6.1 Sıralı listeler Liste içine alınacak metinler...
etiketleri arasına alınarak yazılır. Bu etiketler listenin başladığını ve bittiğini belirtir. Listenin maddelerinin başına ise(list item) etiketini getiriyoruz. Bu etikette tıpkı
etiketi gibi sonlandırılmıyor.etiketine parametreler ekleyebiliyoruz. Bunlarla listemizin rakamla mı harfle mi başlayacağını (type) yada hangi rakam/harfle başlayacağını (start) belirtebiliyoruz. Compact parametresi ise listenin mümkün olan minimum satır aralığına sahip olmasını sağlıyor. Bundan sonraki örneklerimizde sayfa kodunun yalnız body (gövde) bölümünü yazıp diğer kısımlarının yazılmış olduğunu varsayacağız.
Şekil 1.6.1: Sıralı listeler Listeleri buradaki örnekte olduğu gibi iç içe hazırlamak ta mümkün. Dikkat edeceğimiz nokta, işe
- Kimya
li>Fizik
- İnorganik
- Analitik
li>Matematik
- Dinamik
- Statik
- Sayılar
- Diğer
- Türev li>İntegral
etiketi ile başlayıp liste maddelerinin her birisinin başına
etiketini yazmak. Liste içinde yeni bir liste oluşturmak istediğimizde listelenecek maddeden sonra tekrar- etiketini getirmek ve listelemeyi bitirmek istediğimiz yerde
etiketini yazıyoruz ve bahsedilen kuralları aynen uyguluyoruz. Type parametresinde kullanabileceğimiz değerler şunlar olabilir; sayılar,harfler (küçük/büyük)ve romen rakamları (i,ii,iii gibi) 1.6.2 Sırasız Listeler Bu tip listede de mantık aynı. Fark, listeleme yaparken maddelerin başına harf, rakam gibi unsurlar yerine küçük yuvarlaklar,kareler kullanabilmemiz.
etiketi yerine
etiketini kullanıyoruz, maddeler için kullandığımız
- etiketi burada da geçerli.
için parametreler ise şöyle; type için disc (içi dolu daire), circle (içi boş daire), square (içi dolu kare). Compact parametresi sırasız listelerde de kullanılabiliyor.
Şekil 1.6.2 Sırasız listeler 1.6.3 Tanımlama listeleri Bu listelemede kullanılan etiketler şöyle;
- Kimya
- İnorganik
- Analitik
- Fizik
- Dinamik
- Statik
- Matematik
- Sayılar
- Diğer
- Türev
- İntegral
...
,- ...
,- ...
Listenin maddelerini belirtmek için kullandığımız- etiketinin yerini burada
- ve
- etiketleri alıyor. Aynı şekilde
...
veya...
etiketleri arasına aldığımız listeyi bu sefer...
arasına yazıyoruz. Yine parametre olaraketiketi içinde compact ifadesini kullanabiliriz. Hemen örneğimize geçelim, Neler öğrendik?
1.7. LİNKLER ... Geldik HTML'de en önemli unsurlardan birisi olan bağlantılara. Bağlantılar sayesinde hazırladığımız birçok sayfayı birbirleriyle ilişkili hale getirebiliriz. Bir tıklama bizi istediğimiz yere götürecektir. HTML'de metinlere ve resimlere bağlantı kazandırmak mümkündür. Bu yolla başka neler yapılabilir? Ses, grafik dosyaları, sıkıştırılmış dosyalar, internet adresleri,.. bunların hepsine bağlantı kazandırmak mümkün. Hatta yapacağımız bağlantı sayfa içinde, yani dahili bir bağlantı da olabilir. Şimdi yapmak istediğimiz bağlantıya göre kullanacağımız komutları inceleyim: ... Bu komutla oluşturduğumuz bağlantı ile yeni bir sayfa açabilir, kullanıcıyı farklı bir internet adresine yönlendirebilir, kullanıcının kendisine sunduğunuz bir dosyaya ulaşmasını sağlayabilirsiniz. Yani bu tanıma göre bildiğimiz bağlantıları oluşturmak mümkün. Şimdi aşağıdaki örnekleri birlikte inceleyelim, fakat öncelikle bir kuralı belirtelim; ... etiketi arasına yazdığımız yazılar bağlantı özelliğine sahip olacaktır, yazının bağlantı olduğu eğer aksi belirtilmemişse browser tarafından altı çizili ve mavi renkli gösterilir. Ör: buraya tıklandığında meyve resmi açılacak Birinci örnekte "buraya tıklandığında meyve resmi açılacak" yazısına bağlantı özelliği kazandırdığımızdan browser tarafından altı çizili mavi yazıyla gösterilecek ve kullanıcı fare imlecini yazı üzerine getirdiğinde imleç el şekline dönüşecektir. Kullanıcı bu linke tıkladığında browser o anda açık bulunan sayfa ile aynı dizinde bulunan meyve.gif resmini açacaktır. Tabii ki dosya farklı bir dizinde ise kullanıcı hata mesajıyla karşılaşır. Ör: sıkıştırılmış midi dosyalarını çekmek için tıklayın İkinci örnekte aynı şekilde "sıkıştırılmış midi dosyalarını çekmek için tıklayın" yazısına bağlantı özelliği kazandırdık. Fakat dosya tipinden kaynaklanan bir fark var; ilk örnekte meyve.gif'e tıklandığında browser resmi açacaktır fakat bu örnekte browser kullanıcıya midi.zip dosyasını açmak mı yoksa diske kaydetmek mi istediğini soran bir pencere açar. Bunun sebebi browser htm, txt, jpg, gif,.. uzantılı dosyaları görüntüleyebilirken zip, doc, xls, mp3 gibi dosyaları görüntüleyememesidir. Ör: 2.sayfaya gitmek için tıklayın Yine üçüncü örneğimizde oluşturduğumuz linke tıklandığında aynı dizinde bulunan sayfa isimli başka bir html dökümanı açılacaktır. Ör: kedi resmi Ör: işte çok güzel bir karanfil Ör: otomobil resimleri Bu 3 örnekte altdizinlere/üstdizinlere verilen bağlantıya misaller görüyorsunuz,. Ör: tıklayın sitemi ziyaret edin Yedinci örnekte bir internet adresi verdik. Ör: tıklayın dosyaları indirin Bu ise bir ftp adresine verilen link örneği. Ör: mail atın Buradaki linke tıklandığında kullanıcının ilgili mail programı açılacak ve mail'in send to (kime) kısmına verdiğimiz mail adresi otomatik olarak yazılacaktır. ... ... Diyelim ki kullanıcı sayfadaki bir linki tıkladığında, başka bir sayfanın belli bir bölümünün açılmasını istiyoruz, bunun için linke tıklandığında açılacak yazıyı ... ile işaretledikten sonra bağlantı etiketini şu şekilde yazıyoruz: Bu linke tıklandığında başka bir sayfanın ilgili kısmı açılacak Başka bir sayfadaki linke tıklandığında burası açıldı Metinlere bağlantı vermeyi öğrendik, peki sayfadaki resimlere nasıl link vereceğiz? Bunun için resmi yerleştirmek için kullandığımız.
- HTML nedir?
- HTML (HyperText Markup Language-Hareketli-Metin İşaretleme Dili) basitçe, browserlarla görebileceğimiz, internet dokümanları oluşturmaya yarayan bir çeşit dildir...
- HTML'de Temel Unsurlar
- Bu dilde binary veya hexadecimal kodlar yok. Herşey metin tabanlı ve bir HTML dökümanı oluşturmak için ihtiyacınız olan şey bir editör.Piyasada iki tip editör bulunuyor. Birisi metin tabanlı, kod yazmayı gerektiren...
- Listeler
- Sıralı listeler rakam veya harf yada her ikisini içiçe kullanarak liste oluşturmamızı, sırasız listeler rakam/harf yerine madde imleri koyarak liste oluşturmamızı sağlar...
etiketini ... etiketinin arasına alıyoruz. İşte örnek; Ör:
resim.gif tıklanacak resmi, sayfa1.htm resme tıklandığında açılacak sayfayı gösteriyor. "Border" komutu ise resimde bağlantı özelliği olduğunu belirten çerçeveyi kontrol ediyor, 0 (sıfır) değeri bu çerçeveyi tamamen yok eder. Bu komutu değişik sayılarla deneyebilirsiniz. Target parametresi Son olarak bağlantının açılacağı pencereyi belirtmek için kullanılan"target" parametresini öğrenelim; Kullanımı: target="_blank": Bağlantı yeni bir pencerede açılır. target="_self" : Bağlantı aynı pencere içerisinde açılır. target="_top" : Bağlantı aynı pencere içerisinde en üstten itibaren açılır. target="_parent": Açılan bağlantı, o anda açık sayfayı oluşturmuş bir ana sayfa varsa onun yerine konur. target=”çerçeve adı”: Frame komutu ile çerçeve oluşturulmuşsa bağlantının adı verilen çerçevede açılmasını sağlar. 1.8. TABLOLAR
...
Tablolar, sayfaları satırlara/sütunlara bölmek ya da metin veya grafiklerin sayfada istediğimiz yerde durmasını sağlamak amaçlarıyla kullanabileceğimiz HTML'nin en önemli yapıtaşlarındandır. Sayfada gözüksün ya da gözükmesin tabloları bir iskelet gibi kullanabilir, böylece şu ana kadar öğrendiklerinizle yapamayacağınız gerçek düzenlemeyi yapabilirsiniz. Tablolar satır ve sütunlardan oluşur. Tabloya genel bir başlık atayabiliriz. Her sütun için de kendi başlığını oluşturmak mümkündür. Üstteki tablo başlığının altında veya tablonun sona erdiği satırdan sonraki satıra açıklama (thead/caption) koyabiliriz. Ayrıca tablo hücrelerini yanındaki veya altındaki hücrelerle birleştirebiliriz: Tablo Başlığı (thead) Sütun Başlığı #1 Sütun Başlığı #2 Sütun Başlığı #3 Sütun Başlığı #4 Hücre hücre hücre hücre Hücre hücre hücre hücre hücre hücre Tablonun alt yazısı(caption) Şekil 1.8.1 Tablo yapısı Şimdi basit bir tablo yapmak için gerekli etiketleri öğrenelim. Öncelikle...
etiketlerini yazıyoruz ve arasını doldurmaya başlıyoruz.etiketi ile satırları etiketi ile de sütunları oluşturuyoruz. Şekil 1.8.2 Örnek tablolar Ör: Tablo Başlığı (thead)
1.9. FRAME Çerçeveler (frame), HTML'e sonradan eklenmiş bir özelliktir. Bu yüzden eski sürüm browser'lar çerçeve kullanılmış bir sayfayı görüntüleyemezler. (Microsoft Internet Explorer 3.0 ile Netscape Navigator 2.0 ve üstü sürümleri frameleri destekliyor). Çerçeve'ler sayfanın bir tarafı sabit kalırken, diğer tarafını, kullanıcının isteğine göre değiştirme imkanı verir. Bunun anlamı ise kullanılacak çerçeve miktarınca ek HTML sayfası oluşturmak demektir. Browser çerçevenin bir bölümüne yerleştirilecek olan kaynak dosyayı bulamazsa hata mesajı verecektir. Aşağıdaki örneği inceleyelim: Şekil 1.9.1: Frame yapısı Örneğimizde 3 adet html dosyası var. Bunlardan frame.htm dosyası çerçeve komutlarını içeriyor. Bu komutlar browser'a görüntülenmekte olan pencereyi ikiye bölmesini, bunlardan birisinde htm1.htm dosyasını, diğerinde htm2.htm dosyasını görüntülemesini bildiriyor. etiketi ile htm1.htm dosyasının artalan rengi kırmızı, htm2.htm dosyasının artalanı ise mavi yapılmış, kolaylık olması açısından dosyaların adlarını görüntülemeleri için bunlar da yazılmış ve sonuç gördüğünüz gibi. Şimdi bu çerçeveyi birlikte oluşturalım: frame.htm dosyası:alt-yazı (caption) 1.Sütun 2.Sütun 3.Sütun hücre4 hücre5 hücre6 hücre7 hücre8 hücre9 Çerçeveler htm2.htm dosyası: htm2.htm; Çerçeve oluşturmada kullandığımız etiket frameset, cols ifadesi açılacak çerçevelerin yan yana sütunlar şeklinde olacağını belirtiyor, buraya row> yazarsak çerçeveler alt alta satırlar görünümünde açılacaktır. Şekil 1.9.2: cols, rows cols="*,*" ifadesi ile açılacak çerçevelerin pixel cinsinden ebatlarını belirliyoruz, buraya örneğin cols="140,500" gibi sayı yazılabilir, cols="25%,75%" ile browser penceresinin o anki ebadına göre verilen % oranlarına göre şekil alması sağlanabilir yada (*) sembolü ile açılacak çerçevenin ebadı browser'a bırakılır, cols="140,*" ifadesi ilk pencerenin 140 pixel olacağını ikincinin ise ebadının browser'a bırakıldığını gösteriyor. Bu şekilde aynı zamanda açılacak çerçeve sayısını da belirtmiş oluyoruz. cols=".." ifadesine iki değer (ya da yıldız) verirsek bu iki pencere aç anlamındadır, 3 değer 3 pencere açar. frame name="..." src="..." etiketi çerçevelere, bağlantıların TARGET kısmında kullanabilmek amacıyla isim (name) vermeyi sağlıyor. src pencerede görüntülenecek html dosyasının yerini gösteriyor. Açılacak çerçeve sayısı kadar frame name="..." src="..." etiketi kullanıyoruz. Eski sürüm browserların çerçeve etiketini tanımadıklarından bahsetmiştik, işte noframes kısmı bu browserlara hitap ediyor. body kısmını bu eski browserlar görüntüleyebiliyor. Buraya örneğin sayfanın çerçeve kullanılarak yapıldığını gösteren bir mesaj yazılabilir, böylece ziyaretçinin artık yeni sürüm bir browser kullanması gerektiğini hatırlatabilirsiniz. 1.10. FORMLAR Formlar bölümü CGI bölümünde ayrıntılı olarak işlenecektir. BÖLÜM II 2.1. PERL DİLİNE GİRİŞ Perl, C++ ya da C'nin aksine derlenen bir dildir, yani yazılan bir kod Basic dilinde olduğu gibi, derleyici olarak isimlendirilen Perl programı tarafından okunur ve program çalıştırılır. Derleyici, Windows dünyasından tanıdığımız .exe dosyaları oluşturmaz. Yazılan Perl kodu her seferinde Perl program.pl seklinde çalıştırılmak zorundadır. Makine koduna çevrilen kodların aksine, derleyicilerin tek dezavantajı biraz daha yavaş olmalarıdır. Yazılan kod derlenmeden önce Perl derleyicisinin çalışması ve program kodunu incelemesi, programın hızını düşürür. Makine koduna çevrilmiş kodlar bilgisayar işletim biriminin anlayacağı bir dilde olduğu ve tekrar derlenmek zorunda olmadığı için , doğal olarak daha hızlıdırlar. Perl derleyicisinin en büyük avantajı ise, çok çeşitli işletim sistemleri üzerinde kullanılıyor olmasıdır. Buna göre Unix sistemi üzerinde bir PERL programı yazabilir ve bu programı Windows tabanlı bir sistem üzerinde çalıştırabilirsiniz. İşletim sistemleri arasında kod taşırken herhangi bir değişiklik yapmanıza gerek yok. En azından temel fonksiyonları kullandığınız sürece, sistemler arasında kod transferi yapabilirsiniz. Görüldüğü gibi PERL evrensel bir dildir. Ama yinede PERL ile yazabileceğiniz programların sınırları bellidir. PERL ile oyun ya da multimedya programları yazmak imkansız ya da çok zordur. Ama bilgisayar üzerinde günlük islerinizi yapabilmek için PERL'den daha iyisini bulamazsınız. PERL derleyicisini internetten temin ederek, program yazmaya başlayabilirsiniz. Larry Wall, PERL derleyicisini GNU olarak isimlendirilen General Public License altında kullanıma sunmuştur. Buna göre isteyen herkes derleyici ücretsiz olarak bilgisayarı üzerinde kullanabilir. Öncelikle program yazmaya başlamadan önce PERL derleyicisini internetten temin etmemiz gerekiyor. Derleyiciyi kullandığınız işletim sistemi için aşağıdaki adreslerden temin edebilirsiniz. Daha geniş bilgiyi http://www.Perl.com adresinde bulabilirsiniz. Atari ftp://atari.archive.umich.edu/atari/Languages Apple Macintosh http://www.Perl.com/CPAN-local/ports/mac MS-Dos http://www.Perl.com/CPAN-local/ports/msdos Novell Netware http://www.Perl.com/CPAN-local/ports/netware IBM OS/2 http://www.Perl.com/CPAN-local/ports/os2 Windows 95/98 http://www.activeware.com 2.1.1 Bir Perl Betiğinin Yapısı Nasıl ki bir HTML dökümanı ve gibi tag’lar içerirse, yada bir hiperbağ veya resmi göstermek için belirli sentaks kuralları varsa Perl için de aynı şeyler söz konusudur. Perl’in sentaks yapısı oldukça basittir ve anlaşılırdır. Eğer bu sentaks kurallarını bir kereliğine öğrenirseniz Perl ile CGI programı yazmak, HTML yazmak kadar basittir. Perl ile yazılan betiklerde her betik dosyasının ilk satırında aşağıdaki gibi bir deyimin olması gerekir. Bu satır, sunucuya bu betik dosyasının Perl betiği olduğunu söyler. #!/usr/bin/perl Bu satırın yapısı özeldir ve sentaksının hep bu şekilde olması gerekir. Ancak, her sistemde Perl derleyicisinin kurulduğu yer /usr/bin/ dizini olmayabilir. which perl (yada whereis perl )komutlarıyla Perl derleyicinin bulunduğu yeri (yolunu) öğrenmek mümkündür. Yukarıdaki ilk satırdan sonra, Perl kodunu yazmaya başlayabilirsiniz. Perl, yukarıda da belirtildiği gibi, küçük büyük harf duyarlı bir dildir. Yani, ‘x’ ile ‘X’ aynı değildir. Ayrıca, Perl deyimleri noktalı virgül (;) ile sonlanır. Döngüler ve şartlı dallanma yapılarında (;) kullanılmaz. Bir Perl programının temel yapısı şöyledir: #!/usr/bin/perl # # İşte program, # print 'Merhaba dünya!'; # Ekrana mesaj yazdırma Aşağıda her bir kısma ait açıklamalar yer almaktadır.. 2.1.1.1 İlk satır Her Perl programı, aşağıdaki gibi bir satırla başlar. #!/usr/bin/perl Bu satır, sistemden sisteme Perl yorumlayıcısının bulunduğu yere göre farklılılar gösterir. Bu satırın anlamı, bu betik (script ) Perl'de yorumlanarak çalıştırılacak anlamındadır. 2.1.1.2 Açıklamalar ve Deyimler Programa açıklamalar #-diyez sembolü ile eklenirler; bu işaretten satır sonuna kadar olan kısımlar yorumlayıcı dikkate alınmaz (bu kural, ilk satır için geçerli değildir...). Açıklama birden çok satırda yer alacaksa her satırın başına # işareti konulur. Yukarıda olduğu gibi, deyimlere açıklamak yapmak için (;) noktalı virgülden sonra #-diyez konularak açıklama yapılır. 2.1.1.3 Ekrana Yazdırma Ekrana yazdırma için print fonksiyonu kullanılır. Yukarıdaki satırda ekrana "Merhaba dünya!" mesajı yazdırılmıştır ve deyim (;) noktalı virgül ile sonlandırılmıştır. 2.1.1.4 Program çalıştırma Örnekteki programı bir metin editörü yardımıyla yazın ve kaydedin. Bu iş için Emacs iyi bir editördür, çünkü Perl modu denen bir moda sahiptir ve TABa bastıkça satırları anlaşılır ve güzel görünür şekilde düzenler. Ancak, herhangi bir editörü de kullanabilirsiniz. Programı yazıp kaydettikten sonra onu çalıştırılabilir yapmak için UNIX komut satırından chmod +x progname ms-dos komut satırından ise Perl progname komutlarını verelim: chmod u+x progname Buradaki progname, yazdığınız program dosyasının ismidir. Şimdi, komut satırından aşağıdaki komutlardan birini (kabuğa uygun olanını) girerek yazdığınız programı çalıştırınız. perl progname ./progname progname Eğer bazı şeyler hatalı gitmişse hata uyarısı alırsınız, değilse almazsınız. Hataları görmek için programınızı her zaman aşağıdaki gibi çalıştırmanız daha uygundur. perl -w progname Programı çalıştırmadan önce bu şekilde denersek, hatalara karşı ilgili uyarılar ve de bazı faydalı ipuçları ekrana gelir. Bir programı hata ayıklayıcı modunda çalıştırmak için de aşağıdaki komut verilir. perl -d progname Bir program çalıştırılınca ilkin Perl onu derler (yorumlar), bu arada kısa bir duraklama görülür ve ardından programın derlenmiş versiyonu hemen çalıştırılır. İşte, varsa hatalar bu aşamada tespit edilir. Perl sonuçta bir binary dosya üretmez, metin formatındaki dosyaları yorumlayarak çalıştırır. 2.2- SABİT VE DEĞİŞKENLER 2.2.1.Sabitler 2.2.1.1 Sayısal Sabitler: Sayısal sabitler,programın çalışması esnasında gereken sayısal sabit değerlerdir. Perl 8 ve 16 tabanlı sayısal değerlerin kullanımını da sağlar. 1245 100.45 .000034 0x23 ...gibi 2.2.1.2 String Sabitler: String sabitler,programın çalışması esnasında gereken alfasayısal sabit değerlerdir. Alfabetik ve Alfabetik/sayısal/özelkarakter karışımı olabilirler. Tırnak içindeki ifadelerdir. Perl stringlerde; Tek, çift, geri tırnak kullanır. Bunlar birlikte de kullanılabilirler. Örnek: 'Gazi Üniversitesi' "Teknik Eğitim Fakültesi" "Elektronik, "ve Bilgisayar Bölümü."" 'Bilgisayar Sistemleri 'Öğretmenliği' Stringlerde EscapeSequence denilen özel işlevli karakterlerde kullanılır. Escape SequeNCe karakterlerinden bazıları ve anlamları: a Alarm b Backspace -geri- e Escape -çıkış- f Form Feed -form besleme - n Newline -yeni satır- r Carriage return -satır sonu- t Tab - x karakter atla - v Vertical Tab - dikey atla - 2.2.2.Değişkenler 2.2.2.1 Skalar değişkenler : Perl'de en temel değişken, skaler değişkendir. Skaler değişkenlerde hem string, hem de sayı formunda bilgiler saklanabilir ve istendiği zaman tip değiştirebilirler. Skaler değişkenler $-dolar işareti ile başlarlar. Örneğin, aşağıdaki deyim ile $durum = 9; $durum değişkenine 9 değeri atanmıştır. Ve, aşağıdaki deyim ile bu değişkene bir string değer atanmıştır. Yani, $durum değişkeni tip değiştirmiştir. $durum = 'vahim'; Ayrıca Perl'de sayıları string olarak girmek mümkündür. Örneğin; $durum = '9'; $varsayilan = '0009'; şeklinde değerler atanabilir ve değişkenler hem aritmetik, hem de string işlemlerde kullanılabilir. Genel olarak, Perl'de değişken isimleri harflerden, sayılardan ve altçizgi karakterinden oluşurlar; fakat sayı ile ve özel anlamı olduğundan $_ ile başlayamazlar. Ayrıca, Perl küçük/büyük harf duyarlı bir dildir; yani, $a ile $A farklı iki değişkendirler. 2.2.2.2 String değişkenler: String (karakter/karakterler içeren dizi) içerirler. Bu değerler alfabetik ve sayısal sabit veya değişken olabilirler. Ör1: $ad_soyad = "Aydın Kavak"; komutuyla "Aydın Kavak " stringi $ad_soyad string değişkenine atanır. Ör2: $number = 11; $text = "Bu text sayı içerir. İçerdiği sayı $number."; komutlarının icrası sonucu $number'a 11 sayısı atanır. $text değişkenine ise "Bu text sayı içerir. İçerdiği sayı $number." Stringi atanır. Sonuçta $text'in içeriği şudur. "Bu text sayı içerir. İçerdiği sayı 11." 2.3. OPERATÖRLER 2.3.1 Kıyas Operatörleri Bazı yapılar vardır ki sonuçları test sonucuna göre true (doğru) veya false (yanlış) olurlar. Perl'de herhangi bir sıfırdan farklı sayı veya boş olmayan string true (doğru) olarak kabul edilir. Sıfır, '0' ve boş string'ler false (yanlış) olarak ele alınırlar. $x = $a == $b; Yukarıdaki satırda $x in değeri, $a ve $b daki değerlerin durumuna bağlıdır. Şöyle ki: eğer $a,$b ye eşitse, $a == $b eşitliği sonucu doğru değerini taşır(true) ve $x in değeri 0 olmaz. Sıfır olmayan değer taşır. eğer $a,$b ye eşit değilse, $a == $b eşitliği sonucu yanlış değerini taşır(false) ve $x in değeri 0 dır(Sıfır). Burada == operatörünün bir kıyas işlemi yaptığını görüyoruz. Kontrol ifadelerinde kıyas operatörleri sık sık kullanılır. örneğin; if ($a == $b) { print("$a eşittir $bn"); } Perlde, kıyas operatörleri 2 sınıfta kullanılır. 1.Sayısal işlemlerde 2.String işlemlerde 2.3.1.1 Tamsayı Kıyas Operatörleri: Tablo 2.3.1 Tamsayı kıyas operatörleri Operatör Açıklama < Küçük > Büyük == Eşit <= Küçük veya eşit >= Büyük veya eşit != Eşit değil <=> Kıyaslama dönüşü 1, 0, veya-1 Örnek : $a değişkeninde 5 varsa $a > 4 sonucu true (doğru) veya 0 olmayan değer $a > 7 sonucu false (yanlış) veya 0 dır. <=> operatörü özel bir durum arz eder. Aşağıdaki 3 değerden birini döndürür. 0, Kıyaslanan iki değer eşitse 1, ilk değer büyükse -1, ikinci değer büyükse 2.3.1.2. String Operatörler Tablo 2.3.2 String operatörler tablosu String Operatör Kıyas işlemi Sayısal operatör karşılığı Lt Küçük < Gt Büyük > Eq Eşit == Le Küçük veya eşit <= Ge Büyük veya eşit >= Ne Eşit değil != Cmp Kıyas Dönüş 1, 0, or -1 <=> Örnekler : $result = "aaa" lt "bbb"; # Doğru $result = "aaa" gt "bbb"; # Yanlış $result = "aaa" eq "bbb"; # Yanlış $result = "aaa" le "aaa"; # Doğru $result = "aaa" ge "bbb"; # Yanlış $result = "aaa" ne "aaa"; # Yanlış $result = "aaa" cmp "bbb"; # -1 Aynı zamanda mantıksal AND, OR ve NOT operatörlerini de kullanabiliriz: ($a && $b) # $a VE $b true? ($a || $b) # $a VEYA $b true? !($a) # $a false? 2.3.1.3 String - Sayısal Kıyas Karşılaştırması: Aşağıdaki örneklere bakalım. Ör: $sonuç = "123" < "45"; # 123 ile 45 sayısal değer olarak kıyaslanır, sonuç yanlış(false) Ör: $sonuç = "123" lt "45"; # 123 ile 45 alfabetik değer olarak kıyaslanır sonuç doğru(true). 2.3.2 Mantıksal Operatörler && ve || veya ! değil $a || $b # ikisinden biri 0 olmayan değerse doğru $a && $b # sadece her ikiside 0 olmayan değerse doğru ! $a # $a,0 ise doğru Şu kullanım da doğrudur: $a or $b # veya $a and $b # ve not $a # değil $a xor $b # özel veya(birisi 0 olmayan değerse doğru,her ikisi ise değil) 2.3.4 Atama Operatörleri Temel atama operatörü = göstergesidir. $a = 5; # 5 değeri $a değişkenin içine yerleştirilir. Tablo 2.3.3 Atama operatörleri tablosu Operator İzah $a = 1 + 2; #1 ile 2 yi topla ve sonucu $a’da sakla $a = 4-3; #4 ten 3 ü çıkar ve sonucu $a’da sakla $a = 4*3; #4 ile 3’ü çarp ve sonucu $a’da sakla. $a= 7 / 8; # 7’yi 8’e böl (reel) ve sonucu $a’da sakla. $a=9**10; # 9^10 ifadesini hesapla ve sonucu $a’da sakla $a=5 % 2; #5’in 2’ye göre kalanını bu ve sonucu $a’da sakla. ++$a; $a’yı bir artır ve sonra sonucu döndür. $a++; #Sonucu döndür ve sonra $a’yı bir artır. --$a; #$a’yı bir azalt ve sonra sonucu döndür. $a--; # Sonucu döndür ve sonra $a’yı bir azalt. 2.3.3.1 String Birleştirme Ve Tekrarlama: . operatorü, string birleştirir . x operatorü, string tekrarlar. .= operatorü, string birleştirir ve atama yapar. 2.3.3.1.1 Birleştirme : $yenistring = "kara" . "kartal"; satırı sonucu olarak $newstring değişkeninin içeriği "karakartal" olur. . operatörü değişkenlerle de kullanılır. Ör : $string1 = "kara"; $string2 = "kartal"; $yenistring = $string1 . $string2; $yenistring değişkeninin içeriği " karakartal " olur. 2.3.3.1.2 Tekrarlama: $yenistring = "t" x 5; $yenistring değişkeninin içeriği "ttttt" olur. x operatörü değişkenlerle de kullanılır. Ör: $string1 = "t"; $tekrar = 5; $yenistring = $string1 x $tekrar; $yenistring değişkeninin içeriği "ttttt" olur. NOT !!!! : x operatörü kullanırken x etrafında boşluk bulunmalıdır. $yeni = $eski x 5; #Doğru kullanım $yeni = $eskix 5; # Yanlış " $yeni = $eski x5; # Yanlış " 2.3.3.1.3 Birleştirme Ve Atama: $a = "Ata"; $a .= "türk"; # $a nın değeri şimdi "Atatürk" dir. Aşağıdaki kullanımda aynı sonucu verir. $a = "Ata"; $a = $a . "türk"; Perl'deki atama operatörleri: $a = $b; # $b'yi $a'ya ata $a += $b; # $b'yi $a'ya ilave et $a -= $b; # $b'yi $a'dan eksilt $a .= $b; # $b'yi $a'nın sonuna ekle 2.4. LİSTE VE DİZİLER 2.4.1 Listeler: Listeler parantezlerle sınırlandırılmış skalar değişken dizisidir. Ör : (1, 5.3, "hello", 2) Bu listenin 4 elemanı vardır. 1 , 5.3 , hello , ve 2. Elemanı olmayan liste boş listedir Ör : ( ) Ör : (17, 104) listesi 2 elemanlıdır. 17 ve 104. Ör : (17, $var1 + $var2) Bu örnekte 2 elemanlıdır. 17 ve $var1 ve $var2 toplamı. 2.4.2 Diziler Skaler değişkenlerin (sayı veya string) bir listesini içeren değişkenlere dizi değişkenler denir. Dizi değişkenler skaler değişkenlerle aynı formata sahiptirler ve ön ek olarak @-muşmulla işareti ile başlarlar. Aşağıda @yiyecek ve @muzik adında iki dizi tanımlanmıştır. Ör: @yiyecek = ("elma", "armut", "balık"); Ör: @muzik = ("ıslık", "flüt"); Perl'de, dizilerde indisler 0'dan başlar ve [..] köşeli parantezler arasında belirtilirler. Ör: $yiyecek[2] deyimi balık elemanını belirtmektedir. Dikket etmek gerekirse, burada @ işareti $ ile yer değiştirdi, çünkü, $yiyecek[2] bir skalerdir. 2.4.2.1 Dizilere değer atama Aşağıdaki örnekte, @array bir dizidir ve sırasıyla elemanlarına 1,2,ve 3 atanmıştır. Ör: @array = (1, 2, 3); Perl'in genel yapısında, farklı bir bağlamda ele alınan aynı ifade, farklı farklı sonuçlar üretebilir. Örneğin, aşağıdaki ilk ifade ile ikinci ifade aslında aynıdır. Ör: @muzik2 = ("org", @muzik, "harp"); Ör: @muzik2 = ("org", "ıslık", "flüt", "harp"); Perl'de bir dizi değişkeni bir skaler değişkene atamak mümkündür ve bu kullanım şekli için birazcık dikkat etmek gerekir. Ör: $f = @yiyecek; deyimi, $f değişkenine @yiyecek dizisinin uzunluğunu atarken, Ör: $f = "@yiyecek"; deyimi ise, @yiyecek dizisini, elemanlarının arasında boşluk olan bir string şeklinde döndürür. Bu boşluk karakteri yerine, $ özel değişkeninin değerini değiştirmek suretiyle istenilen başka bir karakter de gelebilir. Bu değişken, Perl'deki özel değişkenlerden birisidir. Diziler ayrıca skaler değişkenlere toplu değer atamaları işlemlerinde de kullanılırlar. ($a, $b) = ($c, $d); # $a=$c; $b=$d; ($a, $b) = @yiyecek; # $a ve $b'ye, dizinin ilk ve ikinci elemanı atanır ($a, @yemek) = @yiyecek; # $a'ya, @yiyecek dizisinin ilk elemanı, # @yemek dizisine de diğerleri atanır. (@yemek, $a) = @yiyecek; # @yemek dizisine @yiyecek atanır, # $a ise tanımsızdır. Son olarak, bir dizideki son elemanın indisini öğrenmek istersek, $#dizi_adı ifadesi kullanılır. Ör: $#yiyecek 2.4.2.2 Dizi elemanlarına erişim: Erişim için o elemanın indisi(numarası) verilir. Ör: $var = @array[0]; burada @array dizisinin 1.elemanının indis'i verilerek(Dizilerde ilk eleman numarası 0 dır) o elemanın değerine ulaşılıyor ve değer $var değişkenine atanıyor. Dizilerde @array[0], 1.elemanı, @array[1], 2.elemanı @array[2], 3.elemanı temsil eder ve sıralama bu şekilde devam eder. 2.4.3 Dizi Fonksiyonları Perl'de bir diziye eleman eklemek veya bir elemanı silmek için hazır fonksiyonlar vardır. 2.4.3.1 Ekleme Dizilere eleman eklemek için push fonksiyonu kullnılır. Ör: push(@yiyecek, "yumurta"); deyimi ile @yiyecek dizisinin sonuna yumurta eklenmiştir. İki yada daha çok elemanı diziye eklemek için de aynı fonksiyon kullanılır. Ör: push(@yiyecek, "yumurta", "tereyağı"); Ör: push(@yiyecek, ("yumurta", "tereyağı")); Ör: push(@yiyecek, @sebzeler); push fonksiyonu geridönüş değeri olarak yeni listenin uzunluğunu döndürür. 2.4.3.2 Silme Diziden bir elemanı silmek için pop fonksiyonu kullanılır. Örneğin, aşağıdaki deyim ile @yiyecek dizisinin son elemanı diziden çıkartılmıştır ve @yiyecek dizisinde 2 eleman kalmıştır. Ör: $yemek = pop(@yiyecek); # Şimdi, $yemek = "balık" 2.4.3.3 Sıralama: Bu işlem için kullanılan fonksiyon sort() dur. liste = sort (array); Ör: @array = ("Bu", "bir", "test", "dir"); dizi bu şekilde oluştu. Şimdi sort ile sıralayalım; @array2 = sort (@array); sonuçta @array2 dizisi içeriği listesi şu şekildedir. ("bir", "bu", "dir", "test") @array dizisi içeriği ise değişmez...aynıdır. ("Bu", "bir", "test", "dir") veriler alfabetik değilse; @array = (70, 100, ; @array = sort (@array); o zaman sıralama şöyle gerçekleşir. (100, 70,
2.4.3.4 Ters sıraya sokma: Bu işlemi reverse() fonksiyonu yapar. Ör: @array = ("bal", "incir", "arı", "sinek"); @array2 = reverse(@array); @array2 içeriği listesi şu şekildedir: ("sinek", "arı", "incir", "bal") 2.4.4 Dizilerin Ekrana Yazdırılması Kullanım şekli önemli olduğundan aşağıdaki deyimlerin sonuçları farklı olacaktır. Ör: print @yiyecek; # Elemanlar bitişik Ör: print "@yiyecek"; # Elemanlar arasında boşluk var... Ör: print @yiyecek.""; # Elemanlar sayısı olarak. 2.5 KONTROL YAPILARI Bir dili zenginleştiren ve efektifliğini artıran bileşenlerin başında kontrol yapıları ve döngüler gelir. Perl, C'deki yapılara benzer biçimde tüm kontrol deyimlerini destekler ve kendine özgü olanları da bulundurur. Bu deyimlerin yapısı Pascal'dakilere de benzetilebilir. Şimdi bu deyimleri inceleyelim. 2.5.1. if Deyimi : if ($sayı) { print ("Sayı sıfır değil..n"); } Yukarda bir if deyimli perl program parçası görüyorsunuz. if deyimi yanında () parantez içersindeki değer veya değişken sınanır. Parantezler arası bu kısım şart ifadesidir (Örneğimizde ($sayı).Bu ifadenin içerdiği sonuç doğru ise oklu parantezler (Blokbaşı ve sonunu ifade eder ki kullanılması şarttır) içerisindeki kısım blok olarak icra edilir. Sonuç yanlış ise Blok dışına geçilir. Sonucun doğru(true)olması demek parantez içi değerin 0 olmaması demektir. Değer 0 ise sonuç yanlıştır (false). Örnek Program : #!/usr/local/bin/perl print ("Bir sayı giriniz:n"); $sayi =
; #Program calıştığında burada 7 girelim chop ($sayi); if ($sayi) { print ("Girilen sayı sıfır değil.n"); } print ("Program sonu...n"); 2.5.1.1 if-elsif-else kullanımı: Genel Formatı : if (koşul1) { koşul1 dogru ise icra edilir } elsif (koşul2) { koşul2 dogru ise icra edilir } elsif (koşul3) { koşul3 dogru ise icra edilir ... } else { Hiçbir koşul doğu değil ise icra edilir } Burada dikkat etmek gerekirse elsif kelimesinde “e” harfi yazılmıyor. Yazılırsa hatalı olur. Örnek program: #!/usr/local/bin/perl print ("Bir sayı giriniz:n"); $sayi1 = ; chop ($sayi1); print ("Baska bir sayı giriniz:n"); $sayi2 = ; chop ($sayi2); if ($sayi1 == $sayi2) { print ("Sayılar eşit.n"); } elsif ($sayi1 == $sayi2 + 1) { print ("Birinci sayi 1 buyuk.n"); } elsif ($sayi1 + 1 == $sayi2) { print ("Ikinci sayi 1 buyuk.n"); } else { print ("Sayilar eşit değil.n"); } print ("Program sonu.n"); 2.5.2 For Döngüsü Perl, C'dekine benzer bir for döngüsüne sahiptir. for (başlangıç; test; artım){ deyim1; deyim2; ... } İlk olarak başlangıç deyimi işletilir. Sonra, test işletilir, sonucu true ise döngü deyimleri işletilir. Ardından artım kısmı işletilir. test sonucu true olduğu müddetçe döngü tekrarlanır. Örnek Program: for ($i = 0; $i < 10; ++$i){ # $i = 1 alarak başla, $i < 10 olduğu # müddetçe, $i'yi bi artır. print "$in"; } 2.5.3 While, Do-while ve Do-until Döngüleri Belli bir 'şart sağlandığı müddetçe' veya 'şart sağlanıncaya kadar' çalışan döngülerdir. Aşağıda, doğru şifre girilmediği müddetçe şifre soran bir örnek görüyorsunuz. Örnek Program: #!/usr/bin/perl print "Şifreniz? "; # Şifreyi sor $a = ; # Klavyeden oku chop $a; # En sondaki ENTER karakterini yok et while ($a ne "canan"){ # Girilen şifre yanlış ise ... print "Yanlış şifre.n"; print "Şifreniz ? "; # Şifreyi tekrar sor $a = ; # Klavyeden tekrar oku chop $a; # Tekrar ... } while döngüsünün diğer kullanım şekilleri aşağıdaki gibidir: do{ deyim1; deyim2; } while(test); Bu yapıda test sonucuna bağlı olmaksızın döngü deyimleri en az bir kere işletilirler. Ayrıca, while yerine until de kullanılabilir. Aradaki fark, döngünün, birinde test sonucu true olduğu müddetçe, diğerinde ise test sonucu true oluncaya kadar devam etmesidir. Örnek Program: #!/usr/bin/perl do{ print "Şifreniz? "; # Şifreyi sor $a = ; # Klavyeden oku chop $a; #En sondaki enter karakterini yok et } while ($a ne "canan") # Yanlış giriş yapıldığı # müddetçe tekrar sor Örnek Program: #!/usr/bin/perl do{ print "Şifreniz? "; # Şifreyi sor $a = ; # Klavyeden oku chop $a; # En sondaki ENTER karakterini yok et } until ($a eq "canan") # Doğru giriş yapılıncaya kadar tekrar sor 2.5.4 Foreach Döngüsü Bir dizideki her bir elemanı yada liste-benzeri yapılarla çalışırken (örneğin, metin dosyalar) her bir satırı tek tek ele almak için Perl'de foreach döngüsü kullanılır. Örneğin, Örnek Program: foreach $eleman (@yiyecek){ # Dizideki herbir elemanı sırayla ele al # ve $eleman değişkeninde sakla. print "$elemann"; # Elemanı ekrana yazdır } Dizide kaç tane eleman varsa, her seferinde elemanın değeri döngü değişkenine aktarılır. Her seferinde döngü deyimleri icra edilirler. Buradaki $eleman değişkeni döngü değişkenidir. Eğer @yiyecek dizisi boş dizi ise döngü deyimleri asla işletilmezler. 2.6 BİLEŞİK DİZİLER Bu diziler normal dizilerde,dizi elemanlarının bilinememesi ihtiyacını karşılamak amacıyla tanımlanmışlardır. Örneğin : @dizi dizisinin 1.elemanı $dizi[1] dir ve içeriğini bilmek ise zordur. Oysa ki bileşik dizilerde elemanda bulunan değerin kendisi indistir. $dizi[1] içeriği muz değerini taşıyor olabilir ve bu değeri dışardan anlamak zordur. Bileşik dizide ise $dizi{"muz"} gösterimi vardır. Yani değer indistir. Bu da bir çok kolaylığı beraberinde sunar. Öncelikle bileşik dizilerin tanımından başlayalım. Normal dizi tanımında dizi değişkeni adının başında @ karakteri vardı(@meyveler...gibi). Bileşik dizi değişkeninin başındaki karakter ise % karakteridir. Bir meyveler isimli bileşik dizi tanımlayacak olursak, %meyveler şeklinde kodlarız. Bir diğer fark ise normal dizilerde indis [] karakterleri içinde ifade edilirken bileşik dizilerde { } karakterleri içinde gösterilir. İndiste kullanılacak değerler skaler değer ve değişken adları olabilir. $personel_sicil{14159} $meyve{"kara_yemis"} $reel{3.14159} $tamsayi{-7} $meyve{$meyve_adi} yukarıdaki örneklerin hepsi geçerlidir ve bizlere büyük bir kullanım kolaylığı sağlar. 2.6.1 Bileşik Dizilere Eleman Atama Ve Ekleme Atama şekli normalde aşağıdaki gibidir. $meyve{"elma"} = 1; burada %meyve bileşik dizisinin elma elemanına 1 değeri atanıyor. Örnek Program : Ekrandan meyve adı ve numarası girelim(nar mutlaka olsun). Enter basınca nar adlı meyvenin numarasını bassın, adı ass1.pl olsun. #!/usr/bin/perl $girilen = ; $girilen =~ s/^s+|s+n$//g; %meyve = split(/s+/, $girilen); print ("Nar numarası: $meyve{"nar"}n"); Çalışması: >ass1.pl elma 1 armut 2 nar 3 ayva 4 Nar numarası: 3 2.6.2 Bileşik Dizileri Oluşturma Bu diziler tek bir atama ile oluşturulabilir ve daha sonra eleman ilavesi yapılabilir. %meyveler = ("elmalar", 17, "narlar", 9, "incirler", "yok"); Not: perl5 e ait bir atama özelliği olarak %meyveler = ("elmalar" => 17, "narlar" => 9,"incirler" => "yok"); komutuyla oluşturulan bileşik dizinin index elemanları ve onların değerleri elmalar, 17, narlar, 9, incirler,yok şeklindedir %meyveler dizisine daha sonra elemanı eklemek istersek, mesela, $meyveler{"kiraz"} = 5; kodunu gireriz. Bu kodlama ile meyveler isimli bileşik diziye, yeni bir eleman (indexi kiraz ve buradaki değer olarak ta 5) atanmış olur. Normal dizilerden de bileşik dizi oluşturabiliriz. Örneğin, @meyveler = ("elmalar", 6, "kirazlar", 8, "muzlar", 11); %meyveler = @meyveler; satırları incelendiğinde bu işlemin nasıl gerçekleştiği anlaşılacaktır. Benzer mantıkla bileşik diziden de bileşik dizi oluşturulabilir. %meyveler1 = ("elmalar", 6, "kirazlar", 8, "muzlar", 11); %meyveler2 = %meyveler1; ve pek kullanışlı olmamakla birlikte(dizi elemanlarının sırası belirlenmediğinden), bileşik diziden de normal dizi oluşturulabilir. %meyveler = ("elmalar", 6, "kirazlar", 8, "muzlar", 11); @meyveler = %meyveler; hatta aynı anda diziler ve skalar değişkenlere birlikte de atama yapılabilir. ($degisken1, $degisken2, %bilesikdizi) = @dizi; ...gibi.. yukarda @dizi nin 1.elemanı $degisken1, 2. elemanı ise $degisken2,ye atanır. Sonraki elemanlar ise %bilesikdizi ye atanırlar. Diziye eleman eklemeyi görmüştük. Bu dizilerden eleman silmek en iyi yol hazır fonksiyon olan delete kullanımıdır. Ör: delete($meyva{"Muz"}); satırı ile %meyva bileşik dizisinden Muz elemanı(indexi) silinir. 2.6.3 Dizi İndexlerini Ve Değerlerini Listeleme Bileşik dizilerin indexlerini keys fonksiyonu elde eder. %meyve = ("nar", 9, "muz", 23, "ayva", 11); @meyveindex = keys(%meyve); Yukarıdaki şekilde kodlanan satırların sonucu olarak,keys hazır fonksiyonu, %meyva bileşik dizisinin indexleri olan nar,muz ve ayva yı @meyvaindex dizisine atar. Bu atamayı alfabetik sırada yapmak istersek sort fonksiyonunu da eklememiz gerekir Ör: @meyveindex = sort keys(%meyve); Bileşik dizilerin indexlerini keys fonksiyonu elde eder demiştik değerlerini ise values hazır fonksiyonuyla elde ederiz. %meyve = ("nar", 9, "muz", 23, "ayva", 11); @meyveindex = values(%meyve); @meyveindex dizisinin elemanları; (9, 23, 11) dir. Bir Bileşik dizinin elemanlarına döngü şeklinde erişim(tüm elemanlarına sırayla erişim). Bu işlem için daha önce gördüğümüz keys ve foreach kullanılabileceği gibi, each hazır fonksiyonuda kullanılabilir. Ör: %kayit = ("Mavis", 16, "Arif", 27, "Dinc", 51); foreach $tut (keys(%kayit)) { . . . # sonraki satırlar } Arif, Mavis, ve Dinc ,$tut değişkenine atanırlar. Bu yöntemle indexlere erişildi ama değerlere erişemedik. Değerlere erişim için de yine aynı mantıkla yeni bir foreach döngüsü kullanmamız gerekir. Ama perl bu kullanımın yerine işimizi çok daha kolaylaştıracak olan each fonksiyonuna sahiptir. Bu fonksiyonla hem index hem değeri elde etmek mümkündür. Ör: %kayitlar = ("Mavis", 16, "Arif", 27, "Dinc", 51); while (($tut, $kayit) = each(%kayitlar)) { # satırların devamı } yukarda ilk satırda index ve değerler den oluşan bileşik dizi elemanları, diziyi oluştururlarken while döngüsünün her dönüşünde bu diziye ait index ve değer çifti skalar değişkenlere atanır. $tut, indexi, $kayit ise değeri alır. (ilk dönüşte bunların değerleri Mavis ve 16 dır. Sonraki dönüşlerde aynı kurala göre işler). 2.7 FONKSİYONLAR 2.7.1 Program Veya Proses Bitirme die, warn, exit, kill 2.7.1.1 die ve warn Fonksiyonları : Programlardaki önemli mesajları, gönderme fonksiyonlarıdır. die fonksiyonu programı sonlandırır ve bir hata mesajı verir(standart error dosyasına) die (mesaj); warn’da die gibidir. Yalnız programı sonlandırmaz, icra devam eder. Örnek : warn("UYARI!n"); UYARI! (standart error dosyasına yazar) 2.7.1.2 exit Fonksiyonu : Programı sonlandırır. exit (dönüş kodu) dönüş kodu: Geçirilecek dönüş kodu exit(2); #2 kodu ile programı bitirir. 2.7.1.3 kill Fonksiyonu : kill (sinyal, proseslistesi); sinyal: nümerik sinyal proseslistesi: proses ID Listesi 2.7.1.4 sleep Fonksiyonu : Bu fonksiyon verilen saniye sayısı kadar programı bekletir. sleep (time); time: sn cinsinden sayı sleep(5); (5 sn bekletir) 2.7.2 Diğer Fonksiyonlar Burada işimize yarayacak olan bazı fonksiyonlar ele alınacaktır. 2.7.2.1 chroot Fonksiyonu : Bu fonksiyon root dizini tanımlar. chroot (dir); dir: yeni root DIR chroot ("/u/public"); burası yeni root DIR’ı olur. 2.7.2.2 chop Fonksiyonu : Skalar değerin son karakterini kaldırır. Formatı; chop (deger); Bu arada son karakter lazım ise onu elde etmekte de kullanılır. $yeni=chop($eski); örneğinde $yeni içinde,$eski stringinin son karakteri vardır. Dizilerle kullanılınca da son elemanın, son karakterini tutar. Ör : @dizi = ("al", "ver", "at"); $son = chop(@dizi); # $son içinde t bulunur. 2.7.2.3 chomp Fonksiyonu : String sonundaki kullanılan satır ayırıcı karakterin olup olmadığını test eder bulursa atar. Ör : #!/usr/local/bin/perl $/ = "::"; #Satır ayıracını set etti.$/ sistem değişkenidir $skalar = "Ilkdeger::"; print ("Değişkenin ilk durumu : $skalarn"); $say = chomp($skalar); print ("Değişkenin chomp sonrası durumu $skalarn"); print ("Değişkenden atılan ayraç karakteri sayısı $saynn"); print ("Bir de dizide deneyelimnn"); @liste = ("test1::", "test2", "test3::"); print ("Dizideki ilk durumn"); print ("$liste[0]n"); print ("$liste[1]n"); print ("$liste[2]n"); $say = chomp(@liste); print ("chomp sonrasın"); print ("$liste[0]n"); print ("$liste[1]n"); print ("$liste[2]n"); print ("Dizi elemanlarından atılan toplam ayraç karakterleri sayısı : $sayn"); Çalışması : program.pl Değişkenin ilk durumu : Ilkdeger:: Değişkenin chomp sonrası durumu Ilkdeger Değişkenden atılan ayraç karakteri sayısı 2 Bir de dizide deneyelim Dizideki ilk durum test1:: test2 test3:: chomp sonrası test1 test2 test3 Dizi elemanlarından atılan toplam ayraç karakterleri sayısı: 4 2.7.2.4 crypt Fonksiyonu : NBS data şifreleme standardı (DES) kullanarak stringi şifreler. Formatı; sonuc = crypt (orijinal, tutulan); sonuc : Şifrelenmiş string (ilk iki karakteri tutulan da tanımlı olandır). orijinal : Saklanacak string. tutulan : 2 karakterlik string. Nasıl değiştirileceği tanımlanır.(Bu iki karakter harf, rakam ve . ile / karakterlerinden olabilir.) crypt kullanarak password kontrolü yapılabilir. Örnek program: Bir şifre girilen dosya oluşturalım. Dosya adı passwd1 olsun. İçeriğinde de şifremiz yani: abc./9 Şifremizi bu dosyaya yazdıktan sonra kaydedelim. Daha sonra bunu crypt kullanarak karışık şifre haline getirelim ve crypt ile şifrelenmiş halini aşağıda kodunu yazacağımız program ile ekrana yazdıralım. #!/usr/local/bin/perl open (PAROLA, "passwd1") ||die ("dosya açılamadı"); $sifre = ; chop ($sifre); print "$sifren"; close (PAROLA); $sonuc = crypt($sifre, substr($sifre, 0, 2)); print $sonuc; print "n"; Bu programı çalıştırınca karşımıza yazdığımız parola ve onun crypt ile oluşturulan son şekli gelir. abc./9 abZYvJc9FedlA Bu şekilde abc./9 olarak yazdığımız şifrenin karışık halini elde etmiş oluruz: abZYvJc9FedlA Işte şifre sorarken bunu kullanacağız. Ekrandan şifreyi bir yere not edelim ki daha sonra passwd isimli dosyaya kaydedeceğiz.(Bu işlemi mouse ile cut, paste (kes/yapıştır) şeklinde de gerçekleştirebiliriz.). Şifreyi passwd isimli asıl şifre kontrolu yapacağımız dosyaya yazıp kaydedelim ve çıkalım. passwd dosyası içeriği şimdi abZYvJc9FedlA satırından oluşmuş durumdadır. Gelelim bu dosyadan şifre kontrolu yapmamızı sağlayan programın yazımına Program: Daha önce yine crypt ile oluşturulan sifrenin kontrolü yapan program #!/usr/local/bin/perl open (SIFRE, "passwd") || die ("Dosya açılamadı..."); $sifrem = ; chop ($sifrem); close (SIFRE); print ("Şifrenizi Giriniz:n"); system ("stty -echo"); $parolam = ; system ("stty echo"); chop ($parolam); if (crypt ($parolam, substr($sifrem, 0, 2)) eq $sifrem) { print ("Şifre Doğru ! Giriniz !n"); } else { die ("Giremezsiniz...Program Sonlandırıldı !n"); } Programı çalıştırırsak. $ Program.pl Şifrenizi Giriniz: abc./9 (buraya girdiğiniz karakterler görünmez stty - echo komutu bu işlevi görür) Şifre Doğru ! Giriniz ! 2.7.2.5 grep Fonksiyonu : Stringin içinde pattern arar.. Formatı; Bulunan_eleman_listesi = grep(aranacak_pattern ,aranacak_ liste_elemanları); Örnek : @liste = ("Ad", “Gazi”, "Soyad", “Üniversitesii”); @Bulunan = grep(/^[tT]/, @liste); @liste elemanları içinde t ve T aranır. Bulunan liste elemanı @Bulunan içine konulur. Sonuçta liste elemanları “Gazi” ve “Üniversitesii” dir. 2.7.2.6 splice Fonksiyonu : Dizi değişkeninde depolanmış listenin düzenlenmesini sağlar. Formatı; sonuc = splice (dizi, atlanan, sayi, yeni) dizi : dizi değişkenidir(ekleme yapılacak liste elemanlarını içeren). atlanan : Ekleme öncesi atlanacak eleman sayısı. sayi : Yerleştirilecek mevcut dizi eleman sayısı. yeni : Ekleme yapılan liste.Bu liste dizi elemanı veya haricen tanımlı değişken olabilir. Eğer sayi 0’dan büyük ise, dizi elemanları listesi splice tarafından yerleştirilir. Liste Elemanlarını Yerleştirme (eskinin yerine) replace işlemi : Alt listeyi yerleştirmek için bir başka alt listeye splice kullanabilirsiniz. Örnek : @dizi = ("eski1", "eski2", "eski3", "eski4"); splice (@dizi, 1, 2, ("yeni2", "yeni3")); Bu örnekte; 1. eleman atanır. Sonraki 2. eleman yerine “yeni2” “yeni3” atanır. @dizi dizisinin yeni eleman listesi şu şekildedir artık: ("eski1", " yeni2", " yeni3", " eski4"). Eğer yerine konacak liste elemanı fazla ise orijanal listeyi sağa doğru iterek araya girer. Örnek : @dizi = ("1", "2", "3", "4"); splice (@dizi, 1, 2, ("iki", "ikibuçuk", "üç")); @dizi dizisinin yeni eleman listesi şu şekildedir artık: ("1", " iki", "ikibuçuk", "üç","4"). benzer şekilde liste elemanı az ise sola kaydırır. @dizi = ("1", "2", "3", "4"); splice (@dizi, 1, 2, "bitişik"); @dizi liste elemanları ("1", "bitişik", "4") olur. Not : Liste elemanı etrafına parantez koymak şart değildir. Aşağıdaki 2 örnek aynıdır. splice (@dizi, 1, 2, ("iki", "ikibuçuk", "üç")); splice (@dizi, 1, 2, "iki", "ikibuçuk", "üç"); 2.7.2.6.1 splice ile ekleme : Listenin herhangi bir yerine alt liste(dizi) ekleyebilirsiniz, bunu yapmak için splice (@dizi, 5, 0, "Gazi", "Üniversitesi"); #eleman sayisi 0 olmalıdır. Burada @array dizisinde depolu listeye (“Gazi”, “Üniversitesi”) Listesi eklenir. “Gazi” 6. eleman “Üniversitesi” ise 7. eleman olurlar. Eğer 6. ve 7. elemanlar var ise 8 ve 9. elemanlar olurlar. Her bir eleman sağa iter. Eğer en sonuna yeni eleman eklenecekse atlama değerini –1 seçmelisiniz. splice (@dizi, -1, 0, “Gazi”, “Üniversitesii”); gibi... 2.7.2.6.2 Liste Elemanını Silme : Örnek : @son = splice (@dizi, 8, 2); @dizi dizisinde 9 ve 10. elemanlar silinir.Son durum @son dizisine aktarılır. 2.7.2.7 shift Fonksiyonu : eleman = shift (değişken); eleman : döndürülen eleman (eğer liste -dizi- boş ise null string) shift : dizi değişkeninden ilk elemanı siler ve geri kalanları kaydırır(boşlukları kapatır). Örnek : @dizi = ("1", "2", "3"); $ilkdeger = shift(@dizi); Buradaki işlem şudur: Dizinin 1. elemanı “1” silinir ve $ilkdeger içine atanır. Dizinin son durumu ise (“2”, “3”)’tür. Eğer shift kullanımında dizi yoksa perl, sistem array değişkeni @ARGV’nin ilk elemanının silineceğini düşünür ve işlemi yerine getirir. Mesela program.pl isimli program komut satırından argüman girilerek çalıştırılırsa Program.pl arg1 arg2 arg3 Bu argümanlar (arg1,arg2,arg3) @ARGV dizisinin elemanları olurlar. Default shift bunların ilkini siler. Not : shift fonksiyonu aşağıdaki splice çağrısına eşittir. splice (@dizi, 0, 1) 2.7.2.8 unshift Fonksiyonu : shift fonksiyonu etkisini çözmek eski haline döndürmek için unshift kullanılır. Formatı; Sonucdizisielemansayısı = unshift ( dizi , eklenecekelemanlar); Örnek : unshift (@dizi, "yeni"); @array dizisinin önüne “yeni” elemanını ekler. Diğer elemanlar sağa (veya alta diye de düşünebilirsiniz) kayarak yerleşir. Not : unshift fonksiyonu atlama değeri 0, uzunluk 0 olan splice çağrımı ile eşdeğerdedir. unshift (@dizi, "eleman1", "eleman2"); splice (@dizi, 0, 0, "eleman1", "eleman2") 2.7.2.9 push Fonksiyonu : Biraz önce unshift’in listenin önüne -başına- eleman eklediğini gördük. Listenin sonuna eleman eklemek için push çağırılır. Formatı : push (dizi, eleman); Örnek : push (@dizi, "eklenen"); Not : “eklenen” listenin sonuna eklenir. Listenin sonundan kasıt, daima listede son tanımlanan elemandır. Örnek : @dizi = ("Bir", "Iki"); $dizi[3] = "Dört"; push (@dizi, "Beş"); son içerik; ("Bir", "Iki", "" , "Dört", "Beş"); 3. eleman tanımlanmamıştır null stringtir. Not : Aşağıdaki splice kullanımı ile aynı sonucu verir. push (@dizi, "yenieleman"); splice (@dizi, @dizi, 0, "yenieleman") 2.7.2.10 pop Fonksiyonu : push fonksiyonunun tersidir. Liste sonundaki elemanı siler silinen eleman döndürülür. Döneneleman=pop(dizi); dizi : son elemanı silinecek dizi @dizi isimli dizinin son elemanını silip $donen isimli değişkene atamak için : $donen = pop (@dizi); kodlaması kullanılır eğer tanımlı eleman yoksa tanımsız değer döndürülür. Not : splice ile aynı anlamdaki kullanımı aşağıdaki gibidir. $donen = pop (@dizi); $donen = splice (@dizi, -1) 2.8. STRİNG EŞLEŞTİRME (PATERN MATCHİNG) Perl'in en güzel özelliklerinden biri , sahip olduğu güçlü string işleme yeteneğidir. Bunun çekirdeğinde ise düzenli ifadeler (regular expression) yer almaktadır. 2.8.1 Düzenli ifadeler (regular expressions) Bir düzenli ifade /../-bölü işaretleri arasına alınır ve eşleştirme için =~ operatörü kullanılır. Burada, değişkenin "düzenli ifade"yi içerip içermediği test edilir. İçeriyorsa sonuç true'dur, aksi halde false'dur. Aşağıdaki ifadenin sonucu $cumle değişkeninin içerisinde adem stringi varsa true'dur. $cumle =~ /aydın/ Düzenli ifadeler küçük-büyük harf duyarlıdır. Dolayısıyla, $cumle değişkeni $cumle = "İsmim Aydın Kavak"; olursa, yukarıdaki eşleştirmenin sonucu false olur. !~ operatörü ise eşleşmeyen durumları tesbit etmek için kullanılır. Yukarıdaki örnek şöyle olsaydı, $cumle !~ /aydın/ sonuç true olurdu, çünkü aydın $cumle içerisinde geçmiyor.... 2.8.2 $_ özel değişkeni Aşağıdaki şartlı işletim örneğini incelersek, if ($cumle =~ /altında/){ # $cumle altında içeriyorsa print "Yağmur altında yürüyoruz.n"; } deyimleri eğer $cumle değişkenine aşağıdaki değerler atanırsa testin sonucu true olacağından ilgili mesajı ekrana yazar. $cumle = "Üstündekiler ve altındakiler"; $cumle = "Dün Aşağıaltındağ mahallesine gittim."; Bu tür testlerde çoğu zaman değişkenin değeri, skaler $_ özel değişkenine atanır ve örneğin, yukarıdaki test daha basit bir kullanımla aşağıdaki gibi yazılır. Bu atama işleminden sonra eşleştirme ve eşleştirmeme operatörlerini şöyle kullanabiliriz: $_ = "bizim metnimiz buraya..."; if (/düzenli_ifade/){ print "Evet. Yağmur altında yürüdüm.n"; } $_ özel değişkeni çoğu Perl operasyonlarında varsayılan olarak kabul edilir ve oldukça da yaygın kullanılır. 2.8.3 Düzenli ifadeler ve uygulamalar Düzenli ifadeler içerisinde özel karakterler kullanılarak değişik desenler oluşturulabilir. Böylece çok daha etkin ve geliştirilmiş arama ve eşleştirme imkanları ortaya çıkar. Aşağıda bazı özel karakterler ve anlamları verilmektedir. . # Yenisatır karakteri hariç herhangi bir (tek) karakter ^ # Satırın veya stringin başında, ^xxx $ # Satırın veya stringin sonunda, xxx$ * # Hiç veya birçok karakter, x* + # Bir veya birçok karakter, x+ ? # Hiç veya tek karakter, x? Aşağıda da bazı örnekler yer almaktadır. Unutmamak gerekir ki düzenli ifade /../ arasına alınır. t.e # t, herhangi bir karakter, ardından e # uyanlar : the, tre, tle # uymayanlar : te, tale ^f # f ile başlayanlar ^ftp # ftp ile başlayanlar e$ # e ile bitenler tle$ # tle ile bitenler und* # un ve/veya -varsa- d ile takip eden karakterler # Uyanlar : sun, kunde, undd, unddd (vb.) .* # Yenisatır içermeyen herhangi bir string ^$ # Boş bir satır Yukarıdaki seçeneklere ilave olarak yeni şeçenekler de vardır. [..] köşeli parantezler arasına alınan karakterden herhangi biri olabilir anlamındadır. Eğer ^ ile başlarsa bunlardan herhangi biri olamaz anlamındadır. - çizgi ile belirli bir aralık belirtilebilir. [qjk] # q veya j veya k [^qjk] # q veya j veya k'dan hiçbirisi [a-z] # a-z aralığındaki (küçük) harflerden herhangi biri ** türkçe desteği yok [^a-z] # Küçük harflerden hiçbirisi değil [a-zA-Z] # Herhangi bir harf [a-z]+ # Küçük harfle başlayan herhangi bir string | düşey çubuk, "veya" anlamına gelir ve (...) parentezler alternatifleri gruplamak için kullanılır: jel|krem # jel veya krem (eg|le)gs # eggs veya legs (da)+ # da veya dada veya dadada veya ... Eşleştirmede kullanılan bazı özel karakterler ve anlamları aşağıda verilmiştir. n # Yenisatır t # Tab w # Herhangi bir alfanümerik (word) karakter # yani, [a-zA-Z0-9_] W # Alfanümerik olmayan. yani, [^a-zA-Z0-9_] d # Herhangi bir dijit. yani, [0-9] D # Dijit olmayan, [^0-9] s # Herhangi bir zararsız boşluk: boşluk, tab, yenisatır. # yani, [nt ] S # Zararsız boşluk olmayan, yani, [^nt ] b # Bir kelime ile sınırlı, sadece [..] dışında B # Kelime sınırı yok Açıktır ki yukarıda verilen bu özel anlamı olan $, |, [, ), , / vb karakterlerin bazen kendilerini aramak icab edebilir. Böyle bir durumda karakterin önüne getirilir. Bunun anlamı, karakterin kendisiyle ilgileniliyor, özel anlamı dikkate alınmıyor, demektir. | # Düşey çubuk [ # [ karakteri ) # ] karakteri * # * ^ # ^ / # / # Örnekler [01] # "0" veya "1" /0 # "/0" / 0 # "/ 0" /s0 # "/ 0" boşluk yerine diğer beyaz boşluk karakterleri de olabilir / *0 # "/0" veya "/ 0" veya "/ 0" vb. /s*0 # Yukarıdaki ile aynı, ancak boşluk yerine herhangi bir beyaz boşluk /s*0.0* # "/0." ve "/0.0" ve "/0.00" vb. yada # "/ 0." ve "/ 0.0" ve "/ 0.00" vb. 2.9 EŞLEME VE ÇEVİRME 2.9.1 Eşleme Düzenli ifadeler konusunda anlatıldığı üzere, bu eşleştirmeler üzerinde Perl'in yerine koyma (eşleme) ve dönüştürme yapma (çevirme) özellikleri de vardır. Bunlar, düzenli ifadelerde operatörden sonra s ve tr eklemek suretiyle gerçekleştirilirler. Eğer üzerinde işlem yapılacak değişken belirtilmezsa $_ değişkeni kullanılır. Örneğin, bir $cumle değişkeninde geçen konya kelimelerini Konya ile değiştirmek için aşağıdaki deyim kullanılır. $cumle =~ s/konya/Konya/; yada $_ değişkeninin içindekilerde değiştirmek için aşağıdaki deyim kullanılır. s/konya/Konya/; Bu kullanımda konya desenine uyan yerlere Konya gelecektir. Seçenekler Yukarıdaki örnekte sadece ilk gördüğü yeri değiştirir ve işlem biter. Halbuki bir metnin tamamında bul-değiştir yapılabilir. Bunu yapmak için g (global) seçeneği kullanılır. s/konya/Konya/g; Burada düzenli ifadeye uyan durumlarda 1 (true), aksi hallerde 0 (false) döner. Buarada küçük/büyük harf deseni önemlidir. Eğer kOnya, konYA, KoNYa ve diğer durumlar kelimelerinin hepsi Konya ile değiştirilmek istenirse, i (ignora) seçeneğini kullanılır: s/konya/Konya/gi; Bu i seçeneği temel /.../ düzenli ifade eşleştirmelerinde de kullanılır. Ayrıca, düzenli ifadeler kullanılarak da eşlemeler yapılablir. Örneğin, $_ = "Benim adım x. Babamın adı xx. Dedemin adı da xxx."; s/xx*/Adem/g; print "$_"; En son print deyimi ekrana "Benim adım Adem. Babamın adı Adem. Dedemin adı da Adem." yazacaktır. 2.9.2 Çevirme tr fonksiyonu, karakter karakter çevirme yapar. Aşağıdaki deyim ile $cumle değişkenindeki her a yeine e, her b yerine d, ve her c yerine f gelecektir. Deyim geriye kaç tane eşleştirmenin gerçekleştiği sayısını döndürür. $cumle =~ tr/abc/edf/; Düzenli ifadelede geçerli olan desenlerin çoğu tr fonksiyonunda geçerli değildir. Örneğin, aşağıdaki deyim, $cumle değişkenin kaç karakter uzunlukta olduğunu sayar ve sonucu $adet değişkenine atar. $adet = ($cumle =~ tr/?/?/); Tire (-) işareti ise "arasındakiler" anlamına gelir. Aşağıdaki deyim ile $_ değişkeni büyük harfe çevrilmiştir. tr/a-z/A-Z/; 2.9.2.1 Çeviri Operatörleri Seçenekleri Çeviri operatörleri için 3 seçenek kullanılabilir. Seçenek Anlamı ------- -------------------------------- c Tanımlı olmayan karakterleri seç d Tanımlı tüm karakterleri sil s Birçok aynı çıktı karakterinin , çıktı için sadece 1 tanesini seç Ör: $string =~ tr/d/ /c; ifadesi, rakam olmayan herşeyi ,bir boşluk olarak yerleştirir. Ör: $string =~ tr/t //d; ifadesi, tanımlı her karakteri (tab ve boşluk),$string'ten siler. Ör: $string =~ tr/0-9/ /cs; ifadesi,rakam olmayan herşeyi, rakamlar arasında sadece 1 boşlukla çıktı olarak yerleştirir. Örnek Program : Program adı:pat12 olsun. #!/usr/local/bin/perl $string = ; $string =~ tr/0-9//cd; print ("$stringn"); Çalışması: >pat12.pl Bu stringte 45 var. 45 Bu örnekte $string içindeki rakam olmayan karakterler seçilerek(c) silinmiştir(d). 2.10 Ayrıştırma (split) Perl'de çok kullanışlı bir fonksiyon vardır: split. Bu fonksiyon, bir stringi belirtilen karaktere göre ayrıştırarak parçaları bir diziye yerleştirir. Fonksiyonun birinci parametresi bir düzenli ifade'dir. İkici parametresi de ayrıştırılacak string'tir. Eğer ikinci parametre belirtilmezse $_ değişkeni üzerinde işlem yapar. split fonksiyonunun kullanımı şöyledir: $bilgi = "Caine:Michael:Actor:14, Leafy Drive"; @personel = split(/:/, $bilgi); deyimleri sonucunda @personel dizisinin aldığı değerler şöyle olur: Burada alan ayıracı olarak : iki nokta üstüste karakteri kullanılmıştır. @personel = ("Caine", "Michael", "Actor", "14, Leafy Drive"); Eğer $_ değişkenindeki bilgileri ayrıştırmak istersek şöyle kullanırız. @personel = split(/:/); Eğer bazı alanlar boş olabilir ise ve : karakterleri tekrarlanıyorsa şu şekilde bir kullanım daha uygun olur: $_ = "Capes:Geoff::Shot putter:::Big Avenue"; @personel = split(/:+/); Bu deyimin işletilmesi sonucunda @personel dizisinin aldığı değerler: @personel = ("Capes", "Geoff", "Shot putter", "Big Avenue"); olur. Fakat; $_ = "Capes:Geoff::Shot putter:::Big Avenue"; @personel = split(/:/); deyiminin işletilmesi sonucunda @personel dizisinin aldığı değerler, @personel = ("Capes", "Geoff", "", "Shot putter", "", "", "Big Avenue"); olur. split fonksiyonu yardımıyla bir kelime harflere, bir cümle kelimelere ve bir paragraf cümlelere ayrıştırılabilir. @karakterler = split(//, $kelime); @kelimeler = split(/ /, $cumle); @cumleler = split(/./, $paragraf); Birinci satırda, herhangi iki karakterin arasında NULL (boş) karakterin olduğu düşünülmüştür. NULL karakter, ASCII kodu 0 olan karakterdir. 2.11 Altprogramlar Diğer önemli dillerde olduğu gibi, Perl'de de kullanıcılar kendi fonksiyonlarını tanımlayabilirler. Bunlara Perl'de altprogramlar denilmektedir. Altprogramlar, programın herhangi bir yerinde tanımlanabilirler, ancak programın en başına yada en sonuna yerleştirmesi daha uygundur. Perl'de bir altprogram tanımlama şekli şöyledir: sub mysubroutine { print "Burası sıradan bir rutin gibi.n"; print "Pek farklı bir şey yapmıyoruz ki zaten.n"; } Bir altprogramı çağırmak (kullanmak) için aşağıdaki kullanımlardan herbiri geçerlidir. Görüldüğü gibi, bir altprogram isminin önüne & işareti konularak çağrılmaktadır: &mysubroutine; # Altprogramı parametresiz çağır. &mysubroutine($_); # Tek parametre ile çağır. &mysubroutine(1+2, $_); # İki parametre ile çağır. 2.11.1 Parametreler Yukarıdaki altprogramda parametreler mevcuttur fakat kullanılmamışlardır. Bir altprogram çağrıldığı zaman argümanlar altprograma @_ adında bir liste olarak aktarılırlar. (Bu değişken ile $_ değişkeni arasında mutlak bir bağlantı yoktur.) Aşağıdaki örnek altprogram, kendisine aktarılan parametreleri ekrana yazdırmaktadır. sub printargs{ print "@_n"; } &printargs("Perl", "harika bir dildir"); # Ekrana "Perl harika bir dildir" yazar &printargs("adem", "ile", "havva"); # Ekrana "adem ile havva" yazar Normal dizilerde olduğu gibi, @_ parametre dizisinin elemanlarına da indis vererek erişmek mümkündür. sub printfirsttwo { print "Birinci argüman : $_[0]n"; print "İkinci argüman : $_[1]n"; } &printfirsttwo("Perl", "şahanedir"); Belirtmek gerekirse @_ dizisinin elemanlarını tek tek ele alırsak, bunlar skaler olduklarından $_[0] ve $_[1] olarak yazılırlar. Yine belirtelim ki bunların $_ değişkeni ile doğrudan bir alakası yoktur.. 2.11.2 Geridönüş değerleri Bir altprogramın çağrılması sonucunda genellikle geriye bazı hesaplanan değerler döndürürlürler. Perl'de bir altprogramdan geriye dönen değer, en son ele alınan değerdir. Aşağıdaki örnekte girilen iki sayıdan büyük olanını veren bir altprogram verilmiştir:. sub maximum { if ($_[0] > $_[1]){ $_[0]; } else { $_[1]; } } $buyuk_olan = &maximum(37, 24); # Şimdi $buyuk_olan değeri 37'dir. Yukarıdaki &printfirsttwo altprogramının geridönüş değeri 1'dir.Çünkü enson ele alınan deyim print fonksiyonudur ve bu fonksiyonun geridönüş değeri her zaman 1'dir. 2.11.3 Lokal değişkenler @_ dizisi çağrılan (şuanki) altprograma göre lokaldir, benzer olarak $_[0], $_[1], $_[2], ... değişkenleri de öyle... İstenirse diğer değişkenler de lokal yapılabilir ve bu, giriş parametrelerinin değerlerinin değişmemesi gerektiği durumlarda kullanılmalıdır. Örneğin, sub icerir_mi { local($a, $b); # Lokal değişkenleri tanımla. ($a, $b) = ($_[0], $_[1]); # Gelen argümanları bunlara ata $a =~ s/ //g; # Lokal değişkenlerden $b =~ s/ //g; # boşlukları ayıkla ($a =~ /$b/ || $b =~ /$a/); # $a $b'yi içeriyor mu # veya $b $a'y içeriyor mu? } &icerir_mi("beko", "tecrübe konuşur"); # true 2.12 DOSYA İŞLEMLERİ 2.12.1 Dosya Açma: Biçimi : open (dosyadeğişkeni, dosyaadı); dosyadeğişkeni : Dosyanın basvuracağı, kullanmak istediğiniz isim. Herhangi bir harf,rakam ve _ karakterlerinden oluşur. İlk karakter harf olmalıdır. dosyaadı : Açılacak dosyanın makine içindeki yeri ve adı Örnek: open(FILE1, "file1"); burada işlem yapılacak dosya file1 dir. Ona başvuruyu temsil eden isim ise FILE1 dir. Perl file1' açacağını anlar ve onu FILE1 ile birleştirir. Programda FILE1 adı kullanıldığında file1’ i temsil eder. Eğer değişik bir dizindeki file kullanılacaksa yolu tam verilmelidir. open(FILE1, "/home/eaydin/rehber.dat"); gibi... 2.12.1.2 Dosya Açılma biçimleri: Dosya kullanım amacına göre 3 şekilde açılır. 1.Okuma amacıyla 2.Yazma amacıyla 3.Ekleme Amacıyla 2.12.2.1.Okuma için açma modu : Var olan bir dosya okuma amaçlı açılır. Ör : open(READFILE, "/home/aydin/rehber.dat"); 2.12.2.2.Yazma için açma modu ( > ) : Mevcut olmayan,ilk defa oluşturulacak dosyalar bu mod ile açılır. Eğer mevcut bir dosya bu modda açılırsa içeriği tamamen silinir ve yeniden oluşur. Ör: open (OUTFILE, ">/home/aydin/rehber.dat"); 2.12.2.3.Ekleme için açma modu ( >> ) : Var olan bir dosya yazma(var olan kayıtlara ekleme) amacıyla açılır. Ör: open (APPENDFILE, ">>/home/ertan/rehber.dat"); Önemli Notlar: -Bu modlardan default olanı okuma modudur. -Bir dosya yazma modunda açılırsa içeriği tamamen silinir. -Aynı anda aynı dosyaya hem okuma hemde yazma işlemi yapamazsınız. -Ekleme moduyla açtığınızda sadece ekleme yapabilir ama o dosyadan o anda okuma yapamazsınız. -Eğer standart giriş (klavyeden dosyayayazılma) kullanılacaksa( ;) ; için açma (open) işlemi yapılmaz. 2.12.3 Dosya Açma işleminin doğruluk kontrolü: Bu işlem için if, unless gibi deyim ve fonksiyonlar kullanılarak kontrol yapılır. Eğer hata varsa dönen değer 0 dır. Hata yoksa 0 olmayan eğer döner. Dosya test operatörlerini daha sonra işleyeceğiz. Örnek : if (open(DOSYAM, "/home/aydin/dosya")) { # file başarı ile açıldığında if bloğu içi # olan bu kısım işlenir } # dosya açılmamışsa burası işlenir. Dosyadan okuma biçimi : Dosyayı temsil eden ad <> karakterleri içersinde gösterilir. Ör: $kayit = ; ...gibi Bu komutla DOSYAM ile temsil edilen dosyadan bir kayıt(satır) okunur ve $kayit skalar değişkenine atanır. Örnek:Dosyadan kayıt okuyup ekrana basan program Adı dosya1.pl olsun. Kullanacağımız dosyanın adı bilgi.dat ve içeriğinin de, Bu ilk kayıttır. İkinci kayıt. Dosyadaki son kayıt. şeklinde olduğunu varsayalım. #!/usr/local/bin/perl if (open(DOSYAM, "bilgi.dat")) { $kayit = ; while ($kayit ne "") { print ($kayit); $kayit = ; } } Çalışması : >dosya1.pl Bu ilk kayıttır. İkinci kayıt. Dosyadaki son kayıt. > 2.12.3.1 die() FONKSİYONU ile PROGRAM SONLANDIRMA İŞLEMİ: Herhangi bir durumda programdan çıkış işlemi yapılacaksa die() fonksiyonunu kullanabiliriz. Bu fonksiyonun yazım formatı: die (mesaj); şeklindedir. Ör: die ("Program işleyişi durdu!n"); komutu kullanılmışsa program aşağıdaki mesajla kesilir. Program işleyişi durdu! Şimdi Örnek bir programda bunu kullanalım program adı dosya2.pl programda yine bilgi.dat dosyası ile işlem yapalım... #!/usr/local/bin/perl unless (open(DOSYAM, "bilgi.dat")) { die ("bilgi.dat dosyası açılamadı!!!n"); } # yukardaki unless bloğu yerine şu şekilde de kodlama yapabilirdik. # #open (DOSYAM, "bilgi.dat") || die ("bilgi.dat dosyası açılamadı!!!"); # # # Program akışı bu satıra geldiyse dosya açıldı demektir $kayit = ; while ($kayit ne "") { print ($kayit); $kayit = ; } die fonksiyonu ile hangi satırda hata verdiğini de yazdırabiliriz. Sondaki n karakterini kaldırmamız gerekir. Örnekleri inceleyerek kullanım farkı sonuçlarını anlayalım. die ("Dosya bulunamadın"); Çıktısı : Dosya bulunamadı die ("Dosya bulunamadı"); Çıktısı : Dosya bulunamadı at dosya2 line 14. 2.12.4 Dosyadan Dizilere Okuma: Genel formatı: @array = ; şeklindedir. Bunu örnek programda inceleyelim. Dosyanın tamamı bir diziye okunacak ve ekrana basılacaktır. Program adı dosya4.pl olsun ve bilgi.dat kullanılsın. #!/usr/local/bin/perl unless (open(DOSYAM, "bilgi.dat")) { die ("bilgi.dat dosyası açılamadı!!!n"); } @okuyandizi = ; #Bir üst satırda dosyanın tamamı dizi elemanları olarak diziye alınır #dizi listesi görünümü şu şekildedir #("Bu ilk kayıttır.n" ....>burası $okuyandizi[0],yani dizinin ilk elemanı # "İkinci kayıt.n" ....>burası $okuyandizi[1],yani dizinin ikinci elemanı # "Dosyadaki son kayıt.n") ....>burası $okuyandizi[2],yani dizinin üçüncü elemanı # aşağıda ise ekrana basılır. print (@okuyandizi); Çalışması : >dosya4.pl Bu ilk kayıttır. İkinci kayıt. Dosyadaki son kayıt. Bu okutma işleminde dikkatinizi çekmek istediğim önemli bir nokta vardır. Şöyle ki; Bir dosyadan ,Skalar değişkene tek kayıt okunurken( $liste = ; veya $gir = <>; gibi), dizi değişkenine tum dosya aktarılır( @liste = ; veya @gir = <>; gibi). 2.12.5 Dosyalara Yazma İşlemi : Dosya yazma amaçlı (yazma ve ekleme) açılır. Sonrada yazdırma komutu uygulanır. Örneğin; open(DOSYAM, ">bilgi.dat"); ile açılır print DOSYAM ("Bu ilk kayıttır.n"); komutuylada satır yazılır. Yukarda ki kodlama sonucu bilgi.dat içeriği şöyledir ; Bu ilk kayıttır Bir örnek program yapalım. Program adı dosya5.pl olsun. İki dosya kullanalım veren.dat ve bilgi.dat. veren.dat'tan okutup bilgi.dat'a yazılsın. veren.dat dosyası içeriği şöyle olsun; Bu ilk kayıttır. İkinci kayıt. Dosyadaki son kayıt. #!/usr/local/bin/perl unless (open(VEREN, "veren.dat")) { die ("veren.dat dosyası açılamadı!!!n"); } unless (open(DOSYAM, ">bilgi.dat")) { die ("bilgi.dat dosyası açılamadı!!!n"); } $kayit = ; # veren.dat'tan bir satır,$kayit değişkenine aktarılır. while ($kayit ne "") { # veren.dat kayıtları bitti mi? Bittiyse blok dışına çık. print DOSYAM ($kayit); # $kayit değişkeninde ki satır bilgi.dat'a yazdırılır. $kayit = ; # veren.dat'tan bir satır,$kayit değişkenine aktarılır. } print("Aktarma işlemi tamamlandı !!!"); # tırnak içindeki mesaj ekrana yazdırılır. Çalışması: >dosya5.pl Aktarma işlemi tamamlandı !!! Not: veren.dat dosyasının içeriği aynen bilgi.dat dosyasına aktarılır ve sonuçta her iki dosya içeriği de aşağıdaki görünümde olup aynıdır. Bu ilk kayıttır. İkinci kayıt. Dosyadaki son kayıt. 2.12.6 Standart Çıktı Dosyası: Standart çıktı dosyası tıpkı standart girdi dosyası gibi sistem fonksiyonudur. Standart girdi( ;) klavyeden girişi temsil ediyordu. Standart çıktı aygıtı ise ekrandır. Standart çıktı aygıtına yazdırma işlevini ; komutu görür. Şu iki satırın işlevi aynıdır. print ("Here is a line of output.n"); print STDOUT ("Here is a line of output.n"); dolayısıyla print STDOUT... kullanımına gerek yoktur. Perl bu işi otomatikman yapar. 2.12.7 Standart Hata Dosyası: Buda hazır bir değişken kullanılarak halledilmiştir. Standart hata dosyası ; dir ve ekranı temsil eder. Ekrana çıkmasını istemezsek başka bir dosyaya yönlendirme ile gönderebiliriz. Örnek program : Standart hata(error) kullanımlı program. Dosya adı dosya7.pl olsun #!/usr/local/bin/perl open(DOSYAM, "bilgi.dat") || die ("bilgi.dat dosyası açılamadı!!!n"); print STDERR ("bilgi.dat dosyası başarıyla açıldı !!!.n"); $kayit = ; while ($kayit ne "") { chop ($kayit); print ("U$$kayitEn"); # Büyük harfe çevirerek basar $line = ; } Çalışması: (bilgi.dat dosyası mevcut varsayıyoruz) >dosya7.pl bilgi.dat dosyası başarıyla açıldı !!!. > Not :die () fonksiyonu çıktıyı standart output(çıktı) değil standart error(hata) dosyasına yollar. Bu demektir ki die() fonk.mesajları daima ekrana çıkar. 2.12.8 Dosya Kapatma: Kullanımı sona eren dosyalar close fonk. ile kapatılır. Örnek: close (DOSYAM); # Dikkat ! close (bilgi.dat) değil. 2.12.9 Dosya Statüsünü Belirleme - Test Operatörleri Kullanımı: Statüye karar verme: Dosya işlemlerinde bir çok şeyi test etmeye ve dosya durumunu belirlemeye ihtiyacımız olabilir. Örneğin: Dosya mevcut mu? text dosyası mı? Okunabilir mi? Boş mu? v.b... Bunları belirlemek için kullanılan operatörler vardır. Tablo 2.12.bazı dosya test operatörleri Operatör İzah -d Dosya bir dizin mi? -e Dosya mevcut mu? -f Dosya normal (sıradan) dosya mı? -l Dosya sembolik link mi? -o Dosyanın sahibi kullanıcı mı? -r Dosya okunabilir dosya mı? -s Dosya boş olmayan dosya mı? -w Dosya yazılabilir dosya mı? -x Dosya çalıştırılabilir dosya mı? -z Dosya boş dosya mı? -B Dosya bınary dosya mı? -O Dosya sahibi sadece kendi gerçek kullanıcısı mı? -R Dosya sadece kendi gerçek kullanıcısı tarafından mı okunabilir? -S Dosya socket mi? -T Dosya text dosya mı? -W Dosya sadece kendi gerçek kullanıcısı tarafından mı yazılabilir? -X Dosya sadece kendi gerçek kullanıcısı tarafından mı çalıştırılabilir? Gerçek kullanıcı:loginden girilen kullanıcı adı Örnek program: program adı dosya9.pl. Program yazma amaçlı bir dosya açarken mevcut mu kontrolü yapar. #!/usr/local/bin/perl unless (open(OKUNACAK_DOSYA, "okunandosya")) { die ("okunandosya adlı dosya açılamadı.n"); } if (-e "yazilandosya") { die ("Halihazırda yazilandosya adlı bir dosya var.n"); } unless (open(YAZILACAK_DOSYA, ">yazilandosya")) { die ("yazilandosya adlı dosya açılamadı.n"); } $kayit = ; while ($kayit ne "") { chop ($kayit); print YAZILACAK_DOSYA ("U$kayitEn"); $kayit = ; } Çalışması: >dosya9.pl Halihazırda yazilandosya adlı bir dosya var. > Not : Eğer yazilandosya olmasaydı, okunandosya kayıtları (satırları) yazılandosya adlı dosyaya büyük harflere çevrilerek aktarılacaktı. BÖLÜM III CGI 3.1 CGI NEDİR? CGI, Common Gateway Interface (Ortak Geçit Arayüzü) kelimelerinin kısaltılmışıdır. CGI terim olarak, bir web sunucusu üzerinden; verileri veritabanlarından, dökümanlardan ve diğer programlardan elde etme ve verileri hazırlayıp yine web üzerinden web tarayıcılara sunma metodudur. Daha açıkçası CGI, web tabanlı programlama metodudur. Web tabanlı programlamayı ana hatlarıyla ikiye ayırabiliriz: Sunucu (server) tarafinda programlama ve istemci (client) tarafinda programlama. (yada her ikisi aynı anda.) İstemci tarafında programlama için Java, JavaScript veya VBScript iyi bir seçim olabilir. Sunucu tarafında programlama için en uygun seçenek (UNIX platformu için ve Windows NT için de) CGI’dır. Bir CGI programı kısıtlama olmaksızın istenilen herhangi bir programlama dili ile yazılabilir, ancak Perl en popüler CGI programlama dilidir, çünkü daha çok bu amaçla tasarlanmiştır. 3.1.1 Niçin CGI Öğrenmeliyiz? Eğer web sayfaları tasarlıyorsanız bazen sayfanızı kaç kişinin ziyaret ettiğini öğrenmek isteyebilirsiniz, ziyaretçilerin size mesaj bırakmalarını isteyebilirsiniz yada bir sipariş geçmelerini sağlamak ve buna benzer şeyler isteyebilirsiniz. CGI, tüm bunları ve fazlasını yapmak için size bir takım imkanlar sunar. Günümüzde CGI, basit bir sayaç veya e-mail programından tutun da daha karmaşık ve veritabanı kullanan pek çok siteye kadar her yerde kullanılmaktadır. Mesela; hepimizin bildiği amazon.com, yahoo.com veya hotmail.com sitelerinin gerisinde ne var diye sorarsak, CGI programlamanın olduğunu görürüz. Şimdilerde CGI bilmek, işverenlerin en çok aradıkları bir husus olmuştur ve CGI öğrenerek iyi iş bulma şansınız artar yada mesleğinizde çok hızlı yükselebilirsiniz... 3.1.2 Başlamak İçin Nelere İhtiyacımız Var? Burada hem unix işletim sistemi hem de windows işletim sistemi üzerinde Perl kullanarak CGI programları örnekleri verilecektir. Ayrıca her bölümde yazdığınız CGI programınızı kullanabilmek için gerekli UNIX komutları açıklanacaktır. Eğer UNIX yerine Win NT kullanacaksak, çoğu NT makinası Perl kodunu (unix makinaları gibi) doğrudan çalıştırdığı için daha kolay olacaktır. Ancak, Unix’e özgü olan örnekler Win NT’de çalışmayabilir. Ben çalışmalarımı windows 98 ve Personel web server ile yaptım. Eğer kendi bilgisayarınızda, Windows 98 ortamında çalışmak isterseniz, http://www.perl.com adresinden uygun bir Perl yorumlayıcısı ve http://www.solutionsoft dan PerlBuilder trial indirip kurmalısınız. Tabii bir de Perl desteği olan kişisel web sunucusu kurmak gerekecektir. Apache web server veya Win 98 CD’sinde yer alan Personal Web Server (PWS) uygun olabilir. Gerekli programları kurduktan sonra PWS’nin Perl kodlarını işleyebilmesi için Windows’un registry ayarlarıyla oynamak gerekir. 3.1.2.1 Personel Web Server Kurulumu Perl, Unix dilidir; dolayısıyla herhangi bir Unix-türevi işletim sisteminde (örneğin Linux’ta) hiç bir şey yapmaya gerek olmadan çalışır. NT işletim sistemiyle çalışan Web Server programları da Perl ile yazılmış CGI programlarını çalıştırabilirler. Ücretsiz site yeri veren Web Evsahibi firmalar (Hosting şirketleri) genellikle Unix-tabanlı sistemlere sahiptir. Fakat sizin evsahibiniz NT-tabanlı bir Web Server’a sahipse, büyük bir ihtimalle sistemini Perl’ü tanıyacak ve çalıştırabilecek ekleri yapmıştır. Yazacağımız CGI programlarını sınayacağınız kişisel bilgisayarınız Linux ile çalışıyorsa, muhtemelen bir Web Server programı ya kurulmuştur; ya da elinizdeki Linux dağıtım CD-ROM’unda bunu yapmanızı sağlayacak dosyalar vardır. Linux ile çalışan bilgisayarınıza Web Server programını kurduğunuz zaman bu program Perl’ü anlar, yorumlar ve uygular; özel bir önlem almanız gerekmez. Kişisel bilgisayarınız Windows 95, 98, NT4 WorkStation veya NT4 Server ile çalışıyorsa, sisteminize bir Web Server programını siz kurmak zorundasınız. Windows 2000 Professional veya Windows 200 Server ise Kişisel Web Server programını kendiliğinden kurar. Ancak bütün Windows sistemlerinde, kişisel Web Server’ın Perl ile yazılmış CGI programını anlar hale gelmesini sağlamak size düşer. Şimdi kısaca bir Windows sistemine kişisel Web Server kurma ve bu Server’ı Perl anlar hale getirme konusu üzerinde duralım. Windows 98’e bir kişisel Web Server kurmaya geçmeden önce bilgisayarımıza bir kimlik vermemiz gerekir: Bilgisayarım/Denetim Masası/Ağ’ı tıklayarak açacağınız diyaloğ kutusunda ikinci sekme olan Tanımlama’yı açın ve “Bilgisayar adı” kutusuna istediğiniz adı yazın. Bilgisayarın ağ ortamında olması gerekmez. Sonra Win98 CD-ROM’unda Add-ons klasöründeki PWS dizininde Kur.exe’yi tıklayın. Aynı işlemi NT için Option Pack CD-ROM’unu kullanarak da yapabilirsiniz. Option Pack CD-ROM’undaki Default.htm’i açarsanız, bilgisayarınızın Windows 98 ile çalıştığını algılayacak olan program size Personal (kişisel) Web Server (PWS) kurmayı önerecektir. NT4 Workstation veya NT4 Sevrer sistemlerine kişisel Web Server olarak Internet Information Server (IIS) kurulmalıdır. NT Option Pack CD-ROM’unundaki Default.htm’i açarsanız, program size IIS’ii kurmayı önerecektir. (NT4 sistemlerine IIS’i kurmadan önce, Service Pack 3’ü uygulayın; Internet Explorer 5’i kurun. Elinizde varsa Service Pack 4, 5 veya 6’yı en son uygulayın). Şekil:3.1 Personel Web Server kurulumu Windows 98’e Kişisel Web Server kurulduğunda Masaüstü’nde Yayınla (Publish) adlı bir simge belirecektir. NT sistemlerinde ise Başlat menüsünde Programlar bölümüne IIS Manager satırı eklenir. Bu yollardan biriyle PWS veya IIS’i çalıştırın; Kişisel Web Server Yönetici penceresi açılacaktır. Soldaki araç çubuğunda Yönetici’nin çeşitli bölümlerine gitmeniz gerekli gezinme simgeleri var. Şimdi, açılan ana pencerede iki unsura dikkat edin: 1. Kişisel Web Server’ınızın adı. Bilgisayarınızın adı buraya Server adı olarak yazılmış olmalı. Biraz sonra, Internet’e koymadan önce sınayacağımız CGI programlarını içeren HTML sayfalarını çağırırken, Browser’ın adres kutusuna burada gördüğümüz adı yazacağız. 2. Kişisel Web Server’ın bilgisayarımızda sabit diskteki gerçek adresi. Bu, sizin Kişisel Web Server’ınızın kök (root) dizinidir. Bu genellikle C:inetpubwwwroot klasörüdür. Kişisel Web sitesi yaparsanız, sitenin gerektirdiği bütün dizinleriniz ve dosyalarınız burada gördüğünüz dizinin içinde olmalıdır. Yapacağımız CGI dosyalarını işte bu dizinin içine koyacağız. Bunları bir kenara not ettikten sonra, soldaki araç çubuğunda Gelişmiş simgesini tıklayın; ortadaki pencerede sanal dizinlerinizi görüyorsunuz. Bunlardan Home’u seçin ve sağdaki “Özellikleri düzenle” düğmesini tıklayın. Şekil:3.2 : PWS erişim hakları Ana dizinin okuma, yürütme ve makro erişim haklarının işaretli olmasına dikkat edin. İlerde kendinize Kişisel Web Server’ınızın kök dizininde yeni bir dizin oluşturursanız (örneğin “resimler” gibi) ve içine sitenizle ilgili dosyalar koyarsanız, Gelişmiş penceresinde Ekle düğmesini tıklayarak bu gerçek dizini de sitenin sanal dizinlerinden biri haline getirmeniz gerekir. Gerçek dizinin adı XYZ bile olsa, sanal dizin haline getirirken istediğiniz sanal adı verebilirsiniz. Ama unutmayın, Browser’ın adres hanesine gerçek dizin adını değil sanal dizin adını yazmanız gerekir. Bu işlemleri IIS’te değişik görüntülerle, fakat temel ilkeler itibariyle aynı şekilde yapabilirsiniz. 3.1.2.1.1 PWS Kurulurken Hata Verirse Windows 98’e PWS kurarken, programın Microsoft Transaction Server bölümüne ilişkin sistem kayıtları yapılırken, iki hata mesajı ile karşılaşabilirsiniz (0x80004005 ve 0xfee662). Bu, orijinal Windows 98 CD-ROM’undaki PWS Kur programının, Windows Registry dosyasının büyük olması halinde hata vermesinden kaynaklanıyor. Böyle bir durumla karşılaşırsanız, Bilgisayarım/Denetim Masası/Program Ekle Kaldır aracılığıyla, Personel Web Server’ı kaldırın. Bilgisayar kapanıp açıldıktan sonra, Windows 98 CD-ROM’unda Add-ons/PWS dizinindeki bütün dosyaları, sabit diskinizde Temp dizinine kopyalayın. Sonra http://support.microsoft.com/support/kb/articles/q246/0/81.asp adresinde “Dowload Mstsetup.dll” satırını tıklayın. Mssetup.exe adlı bir dosya bilgisayarınıza indirilince; bu dosyası iki kere tıklayın ve dosyanın genişletileceği yer olarak C:Temp’i gösterin; program Mstsetup.dll dosyasının değiştirilmesini isteyip istemedğinizi sorduğu zaman “Tamam”ı tıklayın. Şimdi, C:Temp’deki Kur.exe (Windows CD-ROM’unuz İngilizce ise Setup.exe) programını iki kere tıklayın. PWS şimdi hatasız kurulacaktır. 3.1.2.1 Windows İçin Perl Şimdi sıra geldi Windows ortamını Perl’den anlar hale getirmeye! Bunun için Internet’ten ActivePerl’ü indirmek veya ActiveState firmasından CD-ROM ısmarlamak zorundayız. Her iki işlem için de http://www.activestate.com adresine gitmemiz gerekir. ActiveState sitesinden ActivePerl’ün son sürümünü indirin ve bilgisayarınıza kurun. Windows 95 kullanıcıları, sistemlerinde Perl programlarını çalıştırabilmek için sistemlerinin DCOM bileşenlerini güncelleştirmek için Microsoft’un sitesinden bazı dosyaları indirmek zorundalar. Bu güncelleştirme için dosyaları http://www.microsoft.com/com/resources/downloads.asp adresinde bulabilirsiniz. (Distributed Component Object Model (DCOM), Windows’un ağda güvenli ve etkin bir tarzda yazılım bileşeni dağıtma teknolojisidir. Eski adıyla "Network OLE," olan DCOM, HTTP dahil, bütün ağ dağıtım ve ulaştırma protokolleri ile uyumludur ve kendi bilgisayarımızda Perl programlarını sınamak için bile olsa Windows açısından gereklidir.) 3.1.2.2.1 ActivePerl’ü kurarken ActivePerl programının kuruluşu sırasında bazı hata mesajları ile karşılaşmak mümkündür. 102, 104, 105, 112 veya 301 sayılı hata mesajlarını alırsanız, bilgisayarınızı kapatıp, açın ve ActivePerl’ü kurmadan önce herhangi bir 16-bit program çalıştırmayın. Sorunu bu yöntemle çözemezseniz, http://support.installshield.com/kb adresinde Q100198 sayılı yaardım dosyasını indirerek, önerileri sırasıyla uygulayın. ActivePerl’ün kurulumunun sonuna doğru “Cannot Craeta Perl Interpreter” mesajını alırsanız, muhtemelen daha önce kurulmuş eski sürüm ActivePerl ile çatışma var demektir. Bu durumda ya eski ActivePerl’ü kaldırır ve klasörlerini silemeniz ya da yeni sürüm ActivePerl’ü yeni bir klasöre kurmanız gerekir. ActivePerl’ü adında boşluk olan dizine kurmayın. ActivePerl’ün işlemesi için gerekli bazı programlar, adında boşluk olan dizinleri göremezler. ActivePerl’ün Kur programının önerdiği varsayılan dizini kabul etmek doğru olur. Ayrıca Kur programının Autoexec.bat ve config,sys dosyalarında yapmayı önerdiği değişiklikleri yapmasına izin verin. Kurma ve diğer sorunlarla ilgili olarak ActiveState’in sitesindeki FAQ (Sıkça sorulan Sorular) dosyalarına başvurabilirsiniz. Özellikle http://www.activestate.com/ActivePerl/ docs/perl-win32/perlwin32faq4.html sayfasında Windows sistemleriyle ilgili geniş bilgi bulabilirsiniz. ActivePerl’ü kurduktan sonra, küçük bir işlemle, PWS veya IIS’i, uzatması .pl olan dosyaları görüntülenmesi için Perl.exe programını çalıştırmak üzere ayarlamanız gerekir. Bu ayar, Windows’un kayıt dosyasını (Regitry) düzenlemeyi gerektiriyor. Kayıt dosyası, Windows 95/98/NT/2000 sistemlerinin düzgün çalışması için gereklidir; bu dosyada yapılacak bir yanlışlık sistemin tümünü çalışmaz hale getirebilir. Aşağıdaki işlemleri yapmaya başlamadan önce Registry’nin yedeğini almak ve bunu bir diskette saklamlak gerekir. Şimdi önce Perl.exe’nin yol bilgisini (Path) bir kenara yazın: örneğin cPerlbinperl exe); ve PWS’i durdurun. Sonra 95/98’de Regedit.exe, NT’de Regedt32.exe programını çalıştırın. Soldaki dizide altı ana-kayıt bölümü göreceksiniz. Bunlardan HKEY_LOCAL_MACHINE’nin önündeki artı işaretini tıklayın. Açılacak listede SYSTEM’i bulun ve önündeki artıyı tıklayın. Açılacak listede CurrentControlSet’i bulun; önündeki artıyı tıklayın. Açılacak listede Services satırını bulun ve önündeki artıyı tıklayın; yeni listede W3SVC satırının önündeki artıyı, sonra Parameter satırının önündeki artıyı tıklayın. Şimdi, açılacak lisdede ScriptMap satırını tıklayın. Sağda, “Varsayılan...(değer atanmamış)” satırını görüyor musunuz? Güzel. Şimdi, Düzen menüsünü tıklayın, açılacak listede Yeni, açılacak alt-listede Dize Değeri maddesini seçin. Sağda, “Varsayılan...” satırının altında “Yeni Değer #1” adlı bir satır oluşacak ve bu kelimeler seçilecektir. Klavyede “.pl” yazın (Nokta işareti, p ve l harfleri). Sonra kKlavyede iki kere Enter’a basın; açılacak Dize Düzenle kutusunda “Değer verisi” hanesine kendi sisteminize uygun olan Perl’ün sabit diskteki yol bilgisini (Path) ile birlikte “%s %s” yazın. Örneğin: c:Perlbinperl.exe %s %s Burada “%s” yazarken s harfinin küçük harf olmasına dikkat edin; büyük S yazarsanız Perl çalışmaz. Bu bilgiyi girdikten sonra Dize Değeri kutusunun Tamam düğmesini tıklayın. Regedit’i kapatın. Bilgisayarı kapatıp, açın ve PWS’i başlatın. Şimdi PWS’ınız Perlce bilir hale gelmiş olmalı! Aynı işlemi NT’de IIS için yapacaksanız, IIS Manager’da Default Web Server’ı durdurun. Regedt32.exe’yi çalıştırdığınızda ve HKEY_LOCAL_MACHINE SYSTEMCurrentControlSet ServicesW3SVCParameterScriptMap’i bulunca Edit menüsünden Add Value maddesini tıklayın. Value Name olarak .pl yazın. Data Type olarak Reg_SZ’i seçin ve String Value olarak perl.exe’nin tam Path’ ile perl.exe %s %s yazın. Regedt32’yi kapatın; IIS Manager’dan Default Web Server’ı çalıştırın. Şimdi sizin NT sisteminiz de Perl anlar hale gelmiş olacak. Ama her iki durumda sistemi sınamak gerekir. Bunun için Not Defterini açıp, aşağıdaki kodları yazıp çalıştıralım: print "HTTP/1.0 200 OKn"; print "Content-Type: text/htmlnn"; print "n"; print "n"; print " MERHABA DÜNYA n"; print "n"; print "n"; print "n"; print "n"; print "Merhaba Dünya
n"; print "n"; print "IP adresiniz: $ENV{REMOTE_ADDR}.n"; print "
n"; print "
Başarılar dileriz!
n"; print "n"; print "n"; Bu dosyayı merhaba.pl adıyla, PWS’ın kök (root) dizinine kaydedin. Browser’ınızı açın ve adres hanesine kişisel Web Server’ınızın adresi ile birlikte dosyanın adını yazın. Örneğin: http://aydin/merhaba.pl Not: Dosya adlarında, HTML’in TITLE etiketinde ve INPUT etiketinin NAME özelliğinde, Perl programlarında değişken adlarında, Türkçe, Fransızca, Flemenkçe, Vietnamca, yani içinde içinde non-ASCII karakter bulunan kelime kullanmak hatalıdır. Bunu sadece görünüm açısından değil, fakat özellikle değişken adlarının daha sonra bulunamaması, hata vermesi gibi durumları önlemek için yapmamak gerekir. Windows ve Unicode uyumlu işletim sistemlerinde veya kendisini Unicde uyumlu olmayıp da sonradan Türkçe sistem desteği kazandırılmış işletim sistemlerinde sorun olmayabilir; fakat CGI programlarınızın nerede, hangi Server’da ve hangi işletim sisteminde çalışacağını bilemezsiniz. Buna karşılık metin alanlarında Türkçe kullanmak, Browser’ı Türkçe-şifreleme konusunda yönlendiren komutları unutmamak şartıyla daima mümkündür. 3.2 HTML-CGI İLİŞKİSİ CGI’a ilk adımımızı HTML’in FORM etiketine ilişkin bilgilerimizi atmak çok yerinde olur. Çünkü Internet’te istemci ile sunucunun bilinçli şekilde etkileştikleri nokta CGI ise, ikisini bu noktada buluşturan ögeler, HTML’in Form ve Anchor () etiketleridir. Form etiketi bir formdaki değerlerini, etiketi ise Browser’i CGI programına gönderir. HTML ile yazılmış ve görüntülenmek üzere Browser programlarına gönderilen metinler başlık ve gövde olmak üzere iki bölüme ayrılır. Başlık bölümü ... etiketlerinin, gövde bölümü ise ... etiketlerinin arasında kalır. Bir HTML belgesinin başlık bölümünde yer alan bilgilerin büyük bölümü Browser’da görüntülenmez; ancak Browser bu bölümdeki bilgilere bakarak, HTML belgesini tanır; bu belgeyi nasıl görüntüleyeceğini öğrenir. Gövde bölümünde ise ziyaretçinin Browser programının görüntülemesini istediğimiz verileri ve bunların nasıl görüntüleneceğine ilişkin kodlarımız yer alır. Bu kodların hemen hepsi, bizim, yani Web sayfası tasarımcısının ziyaretçimize göndermek istediğimiz veriler ve bunların görüntülenmesine ilişkindir; bizden ziyaretçiye, Sunucu’dan İstemci’ye doğru giden bilgilerdir. FORM ve onun içinde yer alan INPUT etiketleri ise, tersine işler: istemciden sunucuya, ziyaretçiden tasarımcıya veri taşır. HTML’in ilk sürümünde Form ve Input etiketleri yoktu;etiketi ile ziyaretçi sadece sitede arama yapabilirdi. Ancak hiç bir Browser tarafından tam uygulanmamış olan bu etiketin yerine HTML’in daha sonraki sürümlerinde istemcinin sunucuya daha çok bilgi gönderebilmesini sağlayan Form ve Input etiketleri geldi. CGI programlarımızı, yukarıdaki örnekte olduğu gibi adreslerini doğruca Browser’ın URL adres kutusuna yazarak da çağırabiliriz. Fakat CGI programlarını çalıştırmanın en yaygın yolu Form etiketidir. Bunu Form etiketinin ACTION özelliği (attribute) yapar. Hatırlarsanız, FORM etiketini şöyle yazarız: Burada Form etiketinin ACTION özelliğinin karşısına CGI programımızın adını, Örneğin, Perl programının dosya adının uzantısına göre, ACTION=”/cgi-bin/merhaba.pl” veya ACTION=”/cgi-bin/merhaba.cgi” yazarız. İstemcinin Form bilgilerini CGI programımıza hangi yöntemle ulaştıracağını belirleyen “Get” ve “Post” özelliklerinin farklarını birazdan ele alacağız. Şimdilik bunu atlayalım. Bu arada Form etiketinin başka özellikleri de vardır; bunlardan “Accept=” ile form bilgisini işleyecek olan Server’a, gönderilen verinin hangi dosya türüne girdiğini, “Enctype=” ile gönderilen verinin nasıl şifrelendiğini bildiririz. Form etiketinin içinde, onun eylemi (Action) ve yöntemi (Method) ile gönderilecek bilgileri derlemeye yarayan başka etiketler bulunur. Şimdi kısaca onları ele alalım: Bir Internet sitesi ziyaretçisinden Input etiketi aracılığıyla tam on ayrı tür bilgi alabiliriz. Input etiketi şöyle yazılır: Input etiketi ile sunucuya, onun arıcılığıyla CGI’ya gelen bilgiye programcılık dilinde değişken denir. Değişkeni, sabit bir adı olan fakat içeriği değişebilen bir bilgi tutucu öge olarak düşünebilirsiniz; bir tür kap. Input’un oluşturduğu değişkenin adı, etiketin NAME (ad) özelliğinden alınır; yani Input’a ad verirken, daha sonra bu adla bir değişkeniniz olacağını düşünmelisiniz. Bu değişkenin değeri ise Ipnut’un türüne göre değişir. Örneğin, TEXT (metin) türü Input’un değeri, Browser’da oluşturacağı kutuya Internet ziyaretçimizin yazacağı kelimelerdir. Input etiketini yazarken VALUE (değer) özelliğini de yazmışsak, (ve ziyaretçinin bunu değiştirmesi olanağı yoksa), değişkenin değeri VALUE özelliğinin karşısına yazdığımız alfanümerik (rakam, harfler veya her ikisi birden) metindir. Bir Form’un içindeki bilgilerle, ziyaretçinin Browser’ından (istemci) kalkıp, bizim Web Server’ımıza ve oradan da CGI’a gelmesi için, genellikle ziyaretçinin ya klavyesinde Enter tuşuna basması ya da tipi Submit (Gönder) olan ve Browser tarafından düğme simgesiyle görüntülenen bir başka Input’u tıklaması gerekir. Fakat “gönder” düğmesi de bir Input olduğu için Form etiketi, içindeki bilgileri paketleyip gönderirken Submit’in (varsa) değerini de gönderir. Şimdi “paketleyip gönderme” olayı üzerinde duralım. CGI programlarımız ziyaretçiden “girdi” olmadan da çalışabilir. Nitekim yukarıda yazdığımız ilk Perl programı ziyaretçinin bir bilgi vermesini gerektirmiyordu. Fakat CGI programı, ziyaretçinin IP adresini, öğrenip, kendisine bildirilyordu. IP numarası, ziyaretçinin sadece bu CGI programını çalıştırmak üzere programın adını Browser’ının adres hanesine yazması ve Enter’a basması (veya yeni Browser’lardaki Go/git düğmesini tıklaması) ile Browser tarafından CGI’a gönderilmiş bir bilgidir. Bu yüzden CGI, ziyaretçi isteyerek ve bilerek Server’a bilgi göndermese de Server ziyaretçiden bilgi edinmesini ve bunu CGI programımıza vermesini bilir! Şimdi bu bilgilerin neler olduğunu görelim. CGI programına Server tarafından iki tür bilgi verilir: 1. Browser, Server ve kendisini hakkındaki bilgiler: Browser’ın türü, yetenekleri, Browser’ın Internet’e giriş noktası (Remote Host, kullanıcı açısından ISS), Server’ın türü, Internet’e bağlandığı geçit (Port), CGI programının adı, bulunduğu dizin, sahip olduğu değişkenler gibi bilgiler, CGI’a çevre değişkenleri (Enivonment Variables) kümesi olarak ulaştırılır (Bu değişkenlere bazı kaynaklarda Ortam Değişkenleri denildiğini görebilirsiniz.. 2. Kullanıcının (Internet ziyaretçisinin) girdiği bilgiler: Kullanıcı Browser penceresinde bir Form doldurmuş ise Form’daki değişkenler ve değerleri (Input etiketlerine verdiğimiz adın değişken adı, bizim verdiğimiz veya kullanıcının girdiği değerlerin de değişkenin değerini oluşturduğunu yukarıda görmüştük) de CGI programına aktarılır. Bu aktarma işlemi iki türlü yapılabilir. Form’un METHOD özelliği GET ise bu bilgiler yukarıda belirttiğimiz çevre değişkenlerine katılarak verilir; METHOD olarak POST kullanmışsak, bu bilgiler standart girdi (standart input veya Perl’ün ifadesiyle stdin) olarak gönderilir. 3.3 CGI’ YE GİRİŞ Daha önce de belitildiği gibi Perl, (Practical Extraction and Report Language) kelimelerinin türetilmiştir ve ilk kez Larry Wall tarafından düşünülmüştür. Daha sonradan ise pek çok gönüllü programcı tarafından geliştirilmiş, kütüphaneleri hazırlanmıştır. Hatta Microsoft da ActiveState projesi dahilinde Perl’i UNIX ortamından Win32 platformuna taşımıştır. Perl betiklerinizi ya kendi lokal makinanızda (Notepad, Simpletext vb. editör programlarıyla) yada Unix sunucu üzerinde hazırlayabilirsiniz. Eğer Linux kullanıyorsanız pico veya joe gibi editör programlarını kullanabilirsiniz. Yazdığınız betikleri kaydederken binary değil, mutlaka text formatında kaydetmelisiniz. (UNIX sistemlerde jpeg/gif/au gibi binary veriler dışında tüm HTML dosyalar ve Perl CGI betikleri text formatındadırlar.) Daha sonra bir FTP programıyla (mesela CuteFTP, WS_FTP gibi) betiklerinizi Unix sunucuya aktarmanız gerekir. Peki nereye? Aksi belirtilmedikçe kendi ev (home) dizininiz altında bulunan ve web sayfalarınızın yer aldığı /home/username/public_html dizinine... Daha sonra ise, Perl betiklerinizin “executable” yani çalıştırılabilir olması için aşağıdaki komutlardan birini kullanarak erişim haklarını değiştirmeniz gerekir. chmod 755 dosyaadı chmod +x dosyaadı Buradaki erişim hakları, sırasıyla dosyanın sahibi, grubu ve diğer kullanıcılar için ayrı ayrı belirtilir. Haklar okuma (r; 4) , yazma (w; 2) ve çalıştırma (x; 1) şeklindedir. 755 (rwx r-x r-x) sahibine okuma, yazma ve çalıştırma; grubuna ve diğerlerine okuma ve çalıştırma hakları verilmiş demektir. Windows 98 te ise PWS kurulumunda anlatıldığı gibi C:Inetpubwwwroot dizinine veya kendiniz sanal dizin açarak onun içine kaydedip gerekli hakları vererek çalıştırabilirsiniz 3.3.1 Bir CGI Betiğinin Yapısı Bir CGI programı da aslında bir Perl betiğidir. Fakat, bir önemli farkı vardır ki CGI genellikle bir web sayfası üretir (hazırlar). (Örneğin; bir form işleme CGI programı, mesela ziyaretçi defteri, genellikle geriye “İlginiz için teşekkür ederiz” türünden bir HTML sayfası gönderir.) Eğer siz de HTML üreten bir CGI programı yazacaksanız programınızın herhangi bir yerine (ilk print deyimini kullanmadan önce) aşağıdaki satırı mutlaka yazmalısınız. print “Content-type:text/htmlnn”; Buna MIME header (başlık) denilmektedir. Ki bu satır, alıcı durumunda olan web tarayıcısına gelen verinin ne tür bir veri olduğunu bildiren bir satırdır. Bu örnekte web tarayıcıya, üretilen ve gönderilen bilginin bir HTML dokümanı olduğu belirtilmek istenmiştir. Eğer bu satırı yazmayı unutursanız yada bu satırdan önce ekrana bir şeyler yazdırırsanız “Internal Server Error” şeklinde bir hata mesajı ile karşılaşırsınız. Böyle bir durumla karşılaşmamak için ilk başa yani #!/usr/bin/perl satırından sonra bu satırı da yazmak gerekir. Bu arada belirtmek gerekirse CGI programlarının uzantıları .cgi ile biter. Ancak, Perl betiklerinin uzantılarının .pl olması şart değildir. Şimdi, first.pl betiğini alalım ve bir web sayfası üreten CGI betiğine dönüştürelim. Bunu da diskte public_html dizini altına first.cgi dosyası olarak kaydedelim. #!/usr/bin/perl print "Content-type:text/htmlnn"; print " Test Sayfası n"; print "n"; print "”; satırında URL’yi çift tırnak içine almak gerektiği için “URL” yerine ”URL” gibi kafa karıştırıcı bir sintaks kullanmak gerekmektedir. Halbuki, ikinci yöntemde bu tür bir kargaşa söz konusu değildir. 3.4 CGI ORTAM DEĞİŞKENLERİ Ortam değişkenleri, çalıştırdığımız her CGI programına web tarayıcı (ve web sunucusu) tarafından gönderilen bir takım gizli bilgilerdir. CGI bunları ayrıştırır, yorumlar ve kendisine bu şekilde gönderilen verileri kullanır. Perl’de ortam değişkenleri ve değerleri %ENV adlı bir özel tabloda tutulurlar. Bazı ortam değişkenleri aşağıda verilmiştir. Tablo 3.1 cgiortam değişkenleri tablosu Değişken Değeri DOCUMENT_ROOT Web sunucusunun (göreceli) kök dizini HTTP_COOKIE Ziyaretiye ait HTTP_HOST Sunucunun adı HTTP_REFERER Betiğinizin çağrıldığı sayfanın URL adresi HTTP_USER_AGENT Ziyaretçinin tarayıcısının türü PATH Sunucuya ait sistem yolu (genellikle /bin, /usr/bin, vb..) QUERY_STRİNG Sorgulama stringi (GET ile) *** REMOTE_ADDR Ziyaretçinin IP adresi REMOTE_HOST Ziyaretçinin makina adı (eğer ters-DNS yoksa yine IP adresi) REMOTE_PORT Ziyaretçinin web sunucuya bağlandığı port numarası REMOTE_USER Ziyaretçinin kullanıcı adı (.htacces’te belirtilen izne göre) REQUEST_METHOD GET veya POST SCRIPT_FILENAME Şuanki (çalışan) betiğin tam yolu (fiziksel) SERVER_ADMIN Webmaster’ın e-mail adresi SERVER_NAME Sunucunun kayıtlı domain adı SERVER_PORT Sunucunun dinlediği (takip ettiği) port numarası SERVER_SOFTWARE Kullandığınız HTTPd sunucu yazılımın adı (örn, Apache/1.3) Bazı sunucular daha farklı ortam değişkenleri de sunabilirler. Bunun için sunucunun dökümanlarına bakmak gerekir. Dikkat etmek gerekir ki, bazı ortam değişkenleri bize sunucu hakkında bilgi verirler ve bunlar değişmezler (örn, SERVER_NAME ve SERVER_ADMIN); bazıları ise kullanıcılar hakkında ve istekler hakkında bilgiler verirler ve değişiklikler gösterirler. Her CGI programı için tüm ortam değişkenlerinin kullanılması gerektiği gibi bir durum söz konusu değildir; gerekenler kullanılır, gerekmeyenler kullanılmazlar. Örneğin, REMOTE_USER değişkeni, .htaccess dosyası ile şifrelenerek korumaya alınmış dizin ve altdizinlerde yer alan sayfalara erişim için kullanılır. Bir kişinin e-mail adresini öğrenmek için güvenilir bir yol bulunmamaktadır; en kestirme olanı bir form kullanarak kullanıcıdan bizzat sormaktır. Her CGI programı için %ENV tablosu otomatik olarak baştan yeniden oluşturulur, bunlardan bize gerekenlerini yada tamamını kullanmak mümkündür. Örneğin, sizin CGI programınızın çağrıldığı sayfanın URL adresini ekrana yazdırmak istersek, print "Şuanki sayfanızın adresi = $ENV{'HTTP_REFERER'}nn"; deyimini kullanırız. Perl’de tüm ortam değişkenlerini elde etmek, sonradan kullanmak üzere bir diziye aktarmak yada ekrana yazdırmak oldukça kolay bir iştir. Şimdi env.cgi adında bir dosya oluşturalım ve aşağıdaki kodları girelim. #!/usr/bin/perl print "Content-type:text/htmlnn"; print < Merhaba dünya!
n"; print "n"; Şimdi, bu programı da bir önceki örnekte olduğu gibi çalıştıralım. Ne gördük? Gördüğümüz o ki; ekrana bir HTML sayfasının kaynak kodları yazıldı. Bu aslında oldukça önemli. Çünkü, üretilen web sayfasını inceleyerek hata olup olmadığını görebiliyoruz. Eğer zaten hata varsa ilgili CGI programı çağrılınca (500 Server Error) hatası üretilir. Bu betiği bir CGI programı olarak nasıl çalıştıracağız? Yazdığımız programı işletim sisteminiz üzerinde bulunan web server’ın kök dizinine kaydetmelisiniz. Daha sonra browser’ınızın URL adres hanesine, server’ınızın protocol ve yol adıyla birlikte programın adını yazıp enter’a basın.(http://aydin/first.cgi). Şimdi bunu hemen deneyelim ve sonucu görelim. Karşımıza “Merhaba dünya!” yazan bir web sayfası gelmiş olmalı. 1. Eğer ekranda “Merhaba dünya!” yazan bir web sayfası yerine bizim yazdığımız Perl kodları görünüyorsa, iki hata söz konusudur; ya first.pl dosyasının adını first.cgi olarak değiştirmeyi unuttuk yada bizim web sunucumuzun CGI konfigürasyonu yapılmamış. İlk iş Webmaster’a başvurarak CGI programlarının nasıl çalıştırılacağını öğrenin. Aksi bir durum yoksa, /var/lib/httpd/conf dizini altında yer alan srm.conf dosyasını açın, AddType ile başlayan satırlardan .cgi içereninin başındaki açıklama #-diyez işaretini kaldırın. Web sunucusunu yeniden başlatın. 2. Eğer “Internal Server Error” şeklinde hata mesajları alıyorsanız, sintaks hataları var demektir. Bu durumda yapmanız gereken şey, betiği komut satırında ./first.cgi yazarak çalıştırmak ve hata olup olmadığını görmektir. 3. Eğer “Forbidden ...” şeklinde hata mesajları alıyorsanız erişim haklarını değiştirin. Perl’de ekrana bir şeyler yazdırmak için print deyimi kullanılır. Yazdırılacaklar “...” çift tırnak yada ‘...’ tek tırnak arasına alınırlar. Değişkenler, $degisken şeklinde yazdırılacak mesajın içinde yer alırlar. Bazı özel karakterleri yazdırmak için -tersbölü işareti kullanılır. Örneğin, #, “, ‘, , @, %, $ ve & işaretlerinin Perl'de özel anlamları vardır ve doğrudan yazdırılamazlar, yazdırmak için önlerine -tersbölü gelir. Bu durum bazen kafa karıştırır. Yukarıdaki CGI programını yazmanın bir diğer (ve daha kolay) yolu da, tek bir print deyimi kullanmaktır: #!/usr/bin/perl print "Content-type:text/htmlnn"; print <Test Sayfası Merhaba dünya!
EndOfHTML; Dikkat etmek gerekirse << ile EndOfHTML arasında boşluk yoktur. Deyimin yapısı şöyledir: print <Gazi Üniversitesi Ortam Değişkenleri EndOfHTML; foreach $key (sort(keys %ENV)) { print "$key = $ENV{$key}
n"; } print ""; Yukarıdaki CGI programını web tarayıcınızden çağırınız. Aşağıdaki görüntüyü elde etmelisiniz. Bu örnekte, sort fonksiyonu kullanılarak %ENV tablosundaki anahtarlar alfabetik olarak sıralanmıştır. Perl’deki sort fonksiyonu sıralama işlemini string değerler üzerinde gerçekleştirir. Bu demektir ki sort fonksiyonu sayılar üzerinde istenildiği gibi doğru çalışmayacaktır. Perl’de kendimize özel yeni sıralama rutinleri oluşturabiliriz. Şekil:3.3 cgi ortam değişkenleri 3.5 FORMLAR 3.5.1 Etkileşimli Formlar Oluşturmak Web sayfalarının en güzel imkanlarından biri, kullanıcıların sayfa üzerinde çeşitli bilgiler girerek bunları web sunuculara gönderebilmesidir. Örneğin, ticari amaçlı bir sayfa tasarlıyorsak, bu sayfa üzerine bir sipariş formu yerleştirebilir ve siparişlerin bu form aracılığıyla bize ulaşmasını sağlayabiliriz. Yada bir veri tabanımız varsa ve bunu bir web sayfası aracılığıyla hizmete sunuyorsak, oluşturacağımız bir arama formu ile kullanıcıların bu veri tabanı üzerinde etkin sorgulamalar yapmasını sağlayabiliriz. Form üzerinde çeşitli seçenekler yerleştirerek kullanıcıların radyo butonları veya işaretleme kutucukları aracılığıyla bu seçeneklerden birini seçmelerini sağlatabiliriz. Hatta oyun oynama mekanizmaları bile oluşturabiliriz. Formlar üzerinde aşağıdaki nesne tiplerini kullanabiliriz: 1. Seçenek butonları (radio button) 2. İşaretleme kutucukları (check box) 3. Listeler (list) 4. Bilgi giriş alanları (text box) 5. Çok satırlı bilgi giriş alanları (memo) 6. Tekli yada çoklu seçim yapılabilen menüler (combo box) 7. Dosya arama pencereleri 8. Sıfırlama (reset) ve gönderme (submit) butonları 9. Gizli alanlar (hidden fields) Web sayfaları üzerinde formlar oluşturmak için FORM tag’ı kullanılır. İç içe formlar oluşturulamaz. Bir döküman içinde birden fazla form kullanılabilir. FORM tag’nın sentaksı şöyledir: Eğer METHOD belirtilmezse varsayılan metod GET’dir, ancak POST metodu da tercih edilebilir. Bu iki metod arasındaki fark nedir, diye sorarsak; GET ile bazı kısıtlamalar söz konudur. POST daha güçlüdür ve veri güvenliği için kullanılması şarttır. POST metodu ile gönderilen veriler, application/x-www-form-urlencoded olarak tanımlanan MIME formatında gönderilirler. 3.5.2 Basit Bir Sorgulama Formu Yukarıda da belirtildiği gibi, verilerin bir HTML formundan CGI’ya gönderilmesi için iki metod kullanılmaktadır: GET ve POST metodları (aslında üç metod vardır: HEAD). Bu metodlar, formdaki verilerin sunucuya ne şekilde gönderileceklerini belirtirler. GET metodunda, formdan girilen veriler URL’nin bir uzantısı olarak CGI’ya gönderilirler ve QUERY_STRING adlı ortam değişkeninde tutulurlar. POST metodunda ise veriler CGI programa veri blokları (stream) olarak gönderilir. Bu bölümde GET metodunu incelemeye çalışacağız. QUERY_STRING ortam değişkenine değer atamak için farklı bir takım yollar vardır. İlk akla geleni, bir CGI programını çağırırken URL adresinin sonuna ?-soru işareti ile başlayan eklemeler yapmaktır. Örneğin, env.cgi programını şu şekillerde çağıralım: http://.........../env.cgi?deneme?deneme1 http://.........../env.cgi?deneme?deneme12 Göreceğiz ki URL’de ?-soru işaretinden sonra yer alan kısım QUERY_STRING ortam değişkenine aktarılacaktır. Aynı şey, GET metodunu kullanan bir formdan bir CGI’ya veri postalandığında da söz konusudur. Şimdi GET metodunu kullanan basit bir form oluşturalım (form.html) ve deneyelim. NOT: Bu örnekte “submit-gönder” butonu kullanılmamıştır. GET metodunu kullanan ve tek bir girdi alanı içeren formlarda ENTER’a basmakla girilen veri hemen CGI’ya gönderilir. Birden çok girdi alanı içeren formlarda “submit-gönder” butonu kullanmak zorunludur. Şimdi, QUERY_STRING ortam değişkeninin iki kısımdan oluştuğunu görmekteyiz: bolumu=Bilgisayar+Prg Sol taraftaki değer, formumuzdaki alanın adıdır. Sağ taraftaki değer ise bizim metin kutusuna yazdığımız bilgidir. Buradan da görülmektedir ki girilen boşluk karakterleri +-artı ile; noktalama işaretleri ve diğer extra karakterler ise %HH şeklinde gösterilmektedirler. Burada HH, ilgili karakterin hexadesimal ASCII kodudur. Eğer form üzerinde birden çok alan kullanmışsak her alan-değer çifti birbirlerinden &-ampersan işareti ile ayrılırlar. Bu kodlama biçimine URL-kodlama (URL encoding) denilir ve hem GET, hem de POST metodları ile gönderilen veriler için uygulanır. GET metodu kullanılan formlarda bu kodlama işlemini web tarayıcımız bizim adımıza gerçekleştirir... Uzun ve karmaşık veriler göndermek için POST metodu daha uygundur. GET metodu esas itibarıyla kısa, tek alanlı sorgulamalar için, özellikle de veritabanı sorgulamaları için elverişlidir. Dahası QUERY_STRING değişkeninin uzunluğu bazı web tarayıcılarda (ve web sunucularda) 255 karakter ile sınırlandırılmıştır. Birden çok alan kullanımına da bir örnek verelim (env.html dosyası olarak kaydedin): Şekil:3.5 env değişkeni Bu form, girilen verileri env.cgi betiğine şu şekilde gönderecektir: $ENV{'QUERY_STRING'}= ad=Aydın&soyad=Kavak Alanlar (ve değerler) birbirlerinden &-işareti ile ayrılmışlardır. Alan-değer çiftlerini elde etmek için Perl’de split adlı fonksiyon kullanılır: Yukarıdaki formdan gelecek olan bilgileri işleyecek kodları yazalım. Aşağıdaki env2.cgi dosyasına kaydedelim, yukarıdaki formun action kısmını action=”env2.cgi” olarak değiştirelim (env2.html) ve deneyelim. #!/usr/bin/perl print "Content-type:text/htmlnn"; print <Ortam Degişkenleri EndOfHTML ; @values = split(/&/, $ENV{'QUERY_STRING'}); foreach $i (@values) { ($varname, $mydata) = split(/=/, $i); print "$varname = $mydata
"; } print ""; 3.5.3 GET Metoduna İlişkin Önemli Uyarılar GET metodu ile verileri göndermek, güvenlik açısından oldukça tehlikelidir; bu nedenle şifre, kredi kartı bilgileri ve diğer önemli bilgileri göndermek için kesinlikle kullanılmamalıdır. GET metodunda veriler gönderilirken URL’nin bir uzantısı olarak gönderildiğinden, web sunucunun log dosyalarına bakılarak bu tür bilgilerin tamamının herhangi bir kullanıcı tarafından öğrenilmesi mümkündür. Gizli ve özel bilgiler gönderilirken POST metodu kullanılmalıdır. POST metodu ayrıca verileri kriptolama özelliğine de sahiptir. GET metodunun en çok kullanıldığı durumlar, bir veri tabanından basit sorgulamalar yapmak suretiyle çeşitli bilgilerin listelenmesi gibi kullanımlardır. Örneğin, yazdığınız makalelerden oluşan bir veri tabanını, verdiğiniz numaraları kullanarak sorgulamak için makale.cgi adında bir CGI betiği yazabilirsiniz ve örn., 23 no’lu makaleyi görmek için “ .../makale.cgi?23” gibi bir URL kullanabilirsiniz. 3.6 FORMLARIN İŞLENMESİ Bundan sonra oluşturacağımız çoğu formda verileri göndermek için POST metodunu kullanacağız. POST metodu, daha önce de belirtildiği gibi, GET metoduna göre oldukça güvenlidir ve daha çok uzunluktaki verileri gönderilebilir. Ayrıca web tarayıcınız, web sunucunuz veya proxy sunucunuz GET sorgularını cache'leyebilir, fakat POST metodunda veriler her seferinde yeniden gönderilir/alınır. Ancak, POST ile gönderilen verileri ayrıştırmak için biraz zahmete girmek gerekir. Web tarayıcılar veya web sunucular, form verilerini CGI programına gönderirken, verileri şu şekilde kodlayarak gönderirler: Standart alfanümerik karakterler aynen korunurlar, boşluklar + artı işaretine çevrilirler, diğer karakterler, örneğin, tab karakterleri, tırnaklar ve extra karakterler, %HH şeklinde kodlanarak gönderilirler. Burada HH, ilgili karakterin hexadesimal ASCII kodudur. Bu kodlamaya URL kodlama (URL encoding) denilmektedir. Aşağıda sıkça kullanılan karakterlerin kodlamaları verilmektedir: Tablo 6.1: ASCII kod tablossu Normal Karakter URL Kodlanmış stringi t (tab) n (return) / / ~ ~ : : ; ; @ @ & & Kullanabilmek için gelen verileri ilk önce çözmek (decode) ve ayrıştırmak gerekir. Bu işlemi Perl'de gerçekleştirmek için iki tane yöntem var: eşleştirme (substitute) ve çevirme (translate). Perl'in çok güçlü bir desen eşleme (pattern mathing) ve yerine koyma-değiştirme özellikleri vardır. Bu özellikleri ve string yapılarını Perl bölümünden biliyoruz Biz form işlemeye dönersek... Kullanıcıdan gelen verileri elden geçirmemiz gerekir. Bunun için iki önemli dönüştürme yapmak gerekir. $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; Birinci satırda, tüm + işaretleri boşluğa çevirilmiştir. İkinci satır biraz karmaşık olmasına rağmen yapılmak istenen şey, pack() fonksiyonu kullanılarak %HH hexadecimal karakterler yerine ASCII karşılıkları yerleştirilmiştir. Şimdi, bütün öğrendiklerimizi uygulayacağımız bir CGI yazalım ve bir isim vererek cgi uzantılı kaydedelim. #!/usr/bin/perl print "Content-type:text/htmlnn"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @degisken_deger = split(/&/, $buffer); foreach $pair (@degisken_deger) { ($degisken, $deger) = split(/=/, $degisken_deger); $deger =~ tr/+/ /; $deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$degisken} = $deger; } print "Formdan Yollanan Bilgiler "; print "Formdan Yollanan Bilgilern"; print "--------------------------
Şekil:3.6.1 Post metodu İstenen bilgileri form üzerinde doldurarak Gönder butonuna basın. Karşımıza yukarıdaki şekildeki gibi göndermiş olduğumuz bilgiler çıkacaktır. Çoğu yerde görmüşüzdür, bir formu doldurup email olarak yollamak mümkündür. Yada formu yolladıktan sonra bize bilgilerin ulaştığına dair bir geri dönüş bilgisi içeren sayfalar gelir. İşte biz de buna benzeyen, formun ulaştığını bir email ile kullanıcıya bildiren CGI yazalım. Buna genelde form-mail denilmektedir. İlk önce bir mail alma/gönderme işini yürüten bir programa (sendmail) ihtiyacımız olacak. Yani, bu programın sistemimizdeki yolu (bulunduğu dizin) bilmek gerekecek. (Bunun için which sendmail yada whereis sendmail komutlarını kullanabilirsiniz. Genelde /usr/sbin/sendmail olur.) Mail.cgi programını kopyalayarak mail2.cgi olarak çoğaltın. foreach döngüsünde bir değişiklik yapacağız. Standart çıktıya yazdırmak yerine değişkenlerin değerlerini bir email mesajına yazdıracağız. O halde, ilkin, sendmail programını girdi olarak açmalıyız. Tabii bu emailin kime gideceğini de belirtmek gerekecektir. Uyarı: @ işaretinin özel anlamı olduğundan bu işareti email adreslerinde kullanırken karışıklığa yol açmamak için, email adreslerini "..." çift tırnak arasına değil '...' tek tırnak arasına almak gerekir. Örneğin, 'a_kavak@mynet.com.tr' gibi veya "a_kavak@mynet.com.tr" gibi. #!/usr/bin/perl print "Content-type:text/htmlnn"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($varname, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$varname} = $value; } $mailprog = '/usr/sbin/sendmail'; $recipient = 'a_kavak@mynet.com.tr'; open (MAIL, "|$mailprog -t") or &dienice("$mailprog bulunamadı.!n"); print MAIL "From: aydkavak@hotmail.comn"; print MAIL "To: $recipientn"; print MAIL "Reply-to: $FORM{'email'} ($FORM{'username'})n"; print MAIL "Subject: Form-mail Denemesinn"; foreach $key (keys(%FORM)) { print MAIL "$key = $FORM{$key}n"; } close(MAIL); print <
n"; foreach $key (keys(%FORM)) { print "$key = $FORM{$key}
", } print ""; Bu CGI, giriş kanalından gelen verileri $buffer adlı bir skaler değişkene aktarmakta ve sonra da "değişken=değer" şeklindeki çiftleri ayrıştırarak $degisken_deger adlı bir diziye aktarmaktadır. foreach döngüsü ile her bir çift normal düz metne çevrilmekte ve elde edilen veriler %FORM adlı özel tabloda saklanmaktadır. Bu FORM tablosunun anahtarları, form girdi isimlerinin kendileridirler. Sonra, örneğin, formdaki değişkenlere -ki bunlar; username, email-address ve age'dir- $FORM{'username'}, $FORM{'email-address'} ve $FORM{'age'} şeklinde erişmek mümkün olmaktadır. Bu kod herhangi bir formdan, yani basit bir ziyaretçi defterinden çok daha karmaşık sipariş formlarına kadar, girilen verileri elde etmek için kullanılabilir. Buradaki örnekte hem değişkenlerin isimleri (kendileri), hem de içerdikleri veriler ekrana yazdırılmıştır. Dikkat çekmemiz gereken bir diğer fonksiyon daha var: split fonksiyonu. Bu fonksiyon, verilen bir stringi belirtilen bir karaktere veya desene göre ayrıştırarak sonucu liste halinde verir. Örneğin, $MyString = "Kırmızı&Mavi&Yeşil"; @MyArray = split(/&/, $MyString); @MyArray dizisi şuanda ("Kırmızı","Mavi","Yeşil") oldu. Şimdi bu script'i test edelim. Bunun için aşağıdaki formu hazırlayalım.Ayrıştırma.html Teşekkürler İlginiz için çok teşşekkür ederiz. Mesajınız alınmıştır.. Ana sayfaya gitmek için buraya tıklayınız.n";