Öncelikle cgi nedir ondan baslayalim:
CGI kelimesi, Common Gatevay Interface kelimelerinin basharflerinden olusan bir kisaltmadir. Türkcesi de "ortak geçit arayüzü" anlamina gelir. CGI ile ziyaretci tarafindan server’a bir is yaptirilir. Bu is ziyaretcinin veritabani olarak kullanilan dosyalara belli konularda kayit yapabilmesi seklinde olabilecegi gibi ziyaretci sayisinin sayilmasi, cookie ile yapilan islemler, web üzerinden mail gönderilmesi seklinde genis bir yelpazede devam eder. CGI programlarinda c++, visual basic scripting gibi diller kullanilabilse de genel olarak CGI programlarinda perl dili kullanilir. Bunun sebebi genis hosting destegi ve perl dilinin köklü ve genis bir dil olusudur. Biz buradaki örneklerimizde ve anlatimlarimizda perl programlama dilini temel alacagiz. CGI programlarinin isleyisi hakkinda örnek verecek olursak web sitemizi ziyaret eden kisilerin görüslerini bildirebilecegi bir ziyaretci defteri yaptigimizi düsünelim. Web sitemize gelen ziyaretci ziyaretci defterine girer, görüslerini bir form vasitasiyla doldurur ve Submit (Gönder) basarak formun "action" kodlariyla belirlenen ve form vasitasiyla bilgilerin gönderilecegi adres olan CGI ya da PL dosyasina bilgiler "bilgi yumagi" halinde gönderilir. bilgileri alan CGI dosyasi bu bilgileri kendisine verilen komutlar dogrultusunda açar, degiskenlere atar, dosyaya kaydeder ve istege bagli olarak mail vasitasiyla defter sahibinin mail adresine gönderir. Sonuç olarak da ziyaretciye bir tesekkür içeren html dosyasi gösterir. Örnegimizde ziyaretci CGI dosyasina bilgileri gönderdi ve CGI dosyasi da server’a bir "is" yaptirdi (dosya açtirdi, dosyaya kaydetti, dosyayi kapatti, mail gönderdi ve tesekkür mesaji içeren html dosyasi yazdirdi)
2.CGI dedigimiz seyle ne yapilir?Yenilir mi içilir mi?
CGI dosyalari az önce de belirttigim gibi server’a bir takim komutlar verip "is" yaptiran programciklardir. CGI dosyalariyla web sitenizin ziyaretcilerle etkilesimini saglayabilirsiniz. Onlarin görüslerini ve önerilerini ögrenebilirsiniz. Bir takim bilgiler alip dosyalara kaydettirebilir, daha sonra bu dosyalari inceleyip ziyaretcilerinizin görüslerini ögrenebilirsiniz. Anket programlariyla insanlarin istediginiz konu hakkinda düsüncelerini ve oranlari ögrenebilirsiniz. Ziyaretci defteri hazirlayip ziyaretcilerinizin görüslerini alabilirsiniz. Forum programlariyla insanlarin bilgilerini paylasabilecekleri ortamlar hazirlayabilirsiniz. Mail formlarla ziyaretcileriniz web üzerinden size e-mail gönderebilmelerini saglayabilirsiniz. Bunun disinda Toplist, mesaj tahtasi vs. gibi programlarla hem web sitenize içerik katarsiniz, hem de ziyaretci sayinizi arttirabilirsiniz.
Perl ile sadece internette degil kendi bilgisayarinizda çalisan, bi takim islerinizde pratiklik kazandiracak programlar da yapabilirsiniz.
Perl ögrenmek zor ve zahmetlidir ama sonucunda bir "programlama dili" ögrenmis olursunuz ve ilerde baska bir programlama diline geçtiginizde özellikle döngüler ve degiskenler konusunda çok rahat edersiniz.
Perl ögrenmek için ortalama html bilgisine (genel kodlar, özellikle form ve input etiketleri) sahip olmaniz gerekiyor. Eger yeterli derecede html bilgisine sahip degilseniz Webdersleri’nin ilgili bölümlerini ziyaret edebilirsiniz. Ayrica bu konuda internette bir çok kaynak var. Bundan sonraki derslerde ortalama html bilgisine sahip oldugunuz varsayilacaktir.
3.CGI/PERL DERSLERI KISISEL WEP SERVER KURULUMU:
Perl ve Kisisel Web Server Kurulumu:
Giris yazisinda da belirittigim gibi Perl programlari sunucu (host) tarafinda çalisan (server side) programlardir. Bu programlarin çalisabilmesi için bilgisayarda bir takim programlarin (server, perl) kurulu olmasi gerekir. Aksi taktirde sadece kaynak kodlarini görebilirsiniz programlarin islem sonucu ekrana nasil bir sayfa verdigini (output) göremezsiniz. Bu derste bilgisayarimizda *.cgi ve *.pl dosyalarini çalistirabilmek için Kisisel Web Server ve Active Perl kurulumunu anlatmaya çalisacagim.
Windows için Active Perl
Windows isletim sistemi altinda Perl programlarini (*.cgi ve *.pl dosyalarini) çalistirabilmek için öncelikle Windows için Active Perl’ün son versiyonunu çekip bilgisayariniza kurmaniz gerekiyor. Bu programi ActiveState.com adresinden edinebilirsiniz. Olasi kurulum problemine karsi -bulabilirseniz- instmsi.exe dosyasina ihtiyaciniz olabilir onu da indirin. Eger oradan bulamazsaniz Microsoft’un web sitesinde "instmsi" seklinde arama yaparak edinebilirsiniz.
Windows 98 için Xitami server kurulumu :
Xitami pratik, kisisel kullanim için ideal, fazla ayar gerektirmeyen ve Windows altinda *.cgi ve *.pl dosyalarini kolaylikla ve hizli bir sekilde çalistirabilen bir server programidir. Kurmasi, kaldirmasi ve kullanmasi çok kolaydir. Öncelikle Xitami’nin web sitesinden Xitami server programinin son versiyonunu indirmelisiniz. Daha sonra Ziya Mete Demircan tarafindan hazirlanmis, Xitami web server programinin kurulumu ve konfigurasyonu hakkinda dosyayi buradan indirebilirsiniz (NOT) . Bu dosyada anlatilan ayarlari dikkatlice yaparsaniz bilgisayariniz sorunsuz bir sekilde *.cgi ve *.pl dosyalarini çalistirabilir hale gelecektir.
Xitami server programi kurulduktan sonra server’inizin ana dizini (baska bir dizine kurmadiysaniz) C:\Xitami\webpages olacaktir. Url adresi olarak http://127.0.0.1 , http://localhost , http://makinanizin_ismi adreslerinden birini kullanabilirsiniz. Bilgisayarinizin adini Baslat/Denetim Masasi/Ag/Tanimlama yoluyla ögrenebilirsiniz. Dosyada gerekli ayarlamalari yaptiktan sonra cgi programlarini çalistiracaginiz dizin adresi http://localhost/altisim/cgi-bin olacaktir.
Windows 98 için Personal Web Server Kurulumu :
PWS programini Windows 98 CE kurulum cd’sinde add-ons klasörü içerisinde pws klasöründe bulabilirsiniz. PWS’yi kurduktan sonra sistem kayitlarinda (registry) bi takim ayarlar yapmaniz gerekiyor. Yapmaniz gereken ayarlar sunlar;
Baslat/Çalistir yoluyla çikan prompt’a "regedit" yazarak sistem kayit düzenleyicisini açin,
Her ihtimale karsi sistem kayitlarinin yedegini alin (Kayit/Kayit dosyasi ver),
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/W3SVC/Parameter/ScriptMap anahtarina yandaki artilari tiklaya tiklaya geçin,
Düzen menüsünü tiklayin, açilacak listede Yeni, açilacak alt-listede Dize Degeri maddesini seçin. Sagda, "Varsayilan..." satirinin altinda "Yeni Deger #1" adli bir satir olusacak ve bu kelimeler seçilecektir. Klavyede ".pl" yazin (Nokta isareti, p ve l harfleri). Sonra kKlavyede iki kere Enter’a basin; açilacak Dize Düzenle kutusunda "Deger verisi" hanesine kendi sisteminize uygun olan Perl’ün sabit diskteki yol bilgisini (Path) ile birlikte "%s %s" yazin. Örnegin:
c:\Perl\bin\perl.exe %s %s
Ayarlarin geçerli olabilmesi için bilgisayarinizi yeniden baslatin.
PWS problemsiz kuruldugunda bilgisayarinizin ana dizini C:\inetpub\wwwroot olacaktir. Url olarak http://127.0.0.1 , http://localhost , http://makina_adi adreslerinden birini kullanabilirsiniz.
Bilgisayarinizin *.cgi ve *.pl dosyalarini çalistirip çalistirmadigini denemek için asagidaki kodlari cgi destekleyen dizininize merhaba.cgi ve merhaba.pl olarak kaydedip browser’inizin adres satirina dosyanin bulundugu dizinin url sini yazarak deneyin. Eger ekrana "merhaba dünya" yazisi geliyorsa bilgisayariniz artik *.cgi ve *.pl dosyalarini taniyor demektir.
#!/usr/bin/perl
# merhaba.cgi - merhaba.pl
print "Content-type:text/html\n\n";
print "Merhaba Cyber-Warrior!";
Dosyalari cgi ya da pl uzantili kaydedebilmek için Bilgisayarim simgesine çift tiklayin, üstten Görünüm’ü tiklayin, Klasör seçenekleri’ni tiklayin ve sekmelerden Görünüm’ü seçin. Burada "Bilinen dosya türleri için dosya uzantilarini gizle" seçeneginin yanindaki isareti kaldirin ve tamam’i seçin. Daha sonra kaydettiginiz dosyayi seçip sag tiklayin, yeniden adlandir’i tiklayin ve dosya adina "merhaba.cgi" yazin.
NOT : Bu dosya, Xitami’de birçok alt site(Webpages içerisinde ayri klasörler seklinde) kullanilacagi ve bunlarin da kendi cgi-bin klasörlerine sahibolacagi düsünülerek hazirlanmistir.
4.CGI/PERL DERSLERI PERL ILE YAZI YAZDIRMA:
Perl ile düzyazi ya da html formatinda yazi yazdirma :
Perl dili ile düzyazi ya da html formatinda yazi yazdirip ekrana çikti verebilmek için print ""; komutu kullanilir fakat perl ile yazdirirken dikkat etmeniz gereken bazi noktalar vardir. Bazi karakterler perl için özel anlam tasir bu karakterleri düzyazi halinde kullanirken perl’ün bu karakterleri dikkate almamasini saglamak amaciyla bu karakterlerin önlerine ters slash (\) koymaniz gerekir. Bu özel karakterler sunlardir:
Noktali virgül (;) : Perl yorumlayicisi döküman içinde noktali virgül görünce o satirin ve komutun bittigini zanneder ve yeni bir komut bekler. Bu yüzden düzyazi ya da html yazdirirken noktali virgül kullanmadan önce ters slash (\) kullanmaniz gerekir aksi taktirde dosya çalismaz ve hatanin nerden kaynaklandigini bulmak baya bir zamaninizi alabilir.
Dollar ($) ve And (&) simgeleri : Bu iki simge Perl için özel anlam ifade eder. Bu anlamlarin ne oldugundan ve fonksiyonlarindan bahsedecegim simdilik bilmemiz gereken bu iki simgenin düzyazi ya da html formatinda yazdirilabilmesi için (tabii fonksiyonuna uygun kullanilmiyorsa) önüne ters slash (\) koymaniz gerektigidir.
Çift tirnak (") : Çift tirnak Perl için özel anlam ifade eder. Perl çift tirnak görünce bir komutun basladigini ya da bittigini anlar. Eger düzyazi ya da html içerisinde çift tirnak kullanacaksaniz önüne ters slash (\) koyarak perl’ün çift tirnagi görmezden gelmesini saglayabilirsiniz.
At (@) : @ isareti de perl için bir anlam ifade eder. Perl bu isareti görünce iliskili dizi (hash) degiskenleri arar ve bulamadigi taktirde hata verir. Eger düzyazi içinde bu isareti kullanacaksaniz ters slash (\) isaretinden sonra kullanmalisiniz.
Yüzde (%) : Yüzde (%) isareti perl için hash dizi degiskeni baslangici anlamina gelir yani özel bir anlam ifade eder. Eger düzyazi olarak ekrana yazdirmak istiyorsaniz önüne ters slash (\) koymaniz gerekir.
Eger düzyazi içerisinde ters slash (\) isareti kullanmaniz gerekiyorsa 3 tane yanyana ters slash kullanmaniz gerekir.
Perl için özel anlam ifade eden simgelerin önüne sadece düzyazi olarak yazdiracaksaniz ters slash (\) koymalisiniz.
Örnek : #!/usr/bin/perl
# duzyazi.cgi
print "Content-type:text/html\n\n";
print "<html>";
print "<head>";
print "<title>Düzyazi Dosyasi</title>";
print "<META content=\"text/html\; charset=ISO-8859-9\" http-equiv=content-type\">";
print "</head>";
print "<bOdy bgcolor=\"#000000\">";
print "<br><br>";
print "<font face=\"verdana\" size=\"2\" color=\"#FFFFFF\">";
print "CGI/Perl programlari yazarken özel karakterlerin (\$,\&, \@, \;,\") önüne ters slash (\\\\\\) koymayi unutmayin!";
print "</font>";
print "</bOdy>";
print "</html>";
Yukaridaki örnekten herhangi bir ters slash (\) isaretini kaldirip sonucunu ve perl’e neden "ögrenmesi zor bir dil" dediklerini görebilirsiniz :). Tavsiyem burda biraz durun ve bol bol ekrana düzyazi yazdiran kodlar yazin ve elinizi alistirin.
Perl ile html yazdirmanin aslinda daha kolay fakat kullanissiz bir yöntemi daha vardir. Kolayligi Perl’ün bu kullanim seklinde tüm yazilari html olarak algilamasi ve ters slash kullanimina gerek kalmamasidir, kullanissizligi ise satirlar arasinda herhangi bir döngü ya da alt program çalistirilamamasi, perl’ün fonksiyonel olarak kullanilamamasidir. Yukaridaki ayni kodlari su sekilde de yazdirabilirdik:
#!/usr/bin/perl
# duzyazi2.cgi
print "Content-type:text/html\n\n";
print <<HtmlBitis
<html>
<head>
lttitle>Düzyazi Dosyasi</title>
<META content=\"text/html\; charset=ISO-8859-9\" http-equiv=content-type\">
</head>
<bOdy bgcolor=\"#000000\">
<br><br>
<font face=\"verdana\" size=\"2\" color=\"#FFFFFF\">
CGI/Perl programlari yazarken özel karakterlerin (\$,\&, \@, \;,\") önüne ters slash (\\\\\\) koymayi unutmayin!
</font>
</bOdy>
</html>
HtmlBitis
;
Bu kodu yazmasi daha kolaydir fakat kullanissizdir. Bundan sonraki örneklerimde ilk verdigim sekilde kullanacagim, sizin de öyle yapmanizi öneririm.
5.CGI/PERL DERSLERI PERLDE DEGISKENLER:
Perl’de degiskenler :
Herhangi bir programlama dili ögrenmeye çalistiginizda ilk ögrenmeniz gereken kavram "degisken" kavramidir. Degiskenlerin Perl dilinde de önemi büyüktür. En basitinden ziyaretci form vasitasiyla veritabanina yazi yazdirirken bu veriler önce ayri ayri degiskenlere atanir daha sonra veritabanina girdisi saglanir. Perl dilinde 3 tür degisken vardir. Degiskenlerin baslangicinda perl’ün degiskeni algilayacagi isaret vardir. Eger degisken tekil degisken ise dollar ($), dizi degisken ise at (@), iliskili dizi degisken ise yüzde (%) isareti degisken atanirken degisken isminden önce yazilir. Degisken isimleri rakam ya da harf olabilir ama isaretlerden sadece alt çizgi (_) kullanilabilir.
Tekil (Scalar) degiskenler :
Tekil degiskenler içeriginde belli bir yazi, rakam ya da isaret ($#"%&...) tutarlar. Perl bir kodun tekil degisken oldugunu basindaki Dollar ($) isaretinden anlar ve bu isaretin içerigini bilgisayarin bellegine, daha sonra kullanilmak üzere alir. Tekil degisken adlari rakam ya da harf olabilir fakat alt çizgi(_) disinda bir isaretle isimlendirilemezler. Tekil degisken adlari büyük ya da küçük harfle kullanilabilir fakat Perl büyük harf ile küçük harfi ayri ayri algilar yani perl için "Degisken" kelimesi ile "degisken" kelimesi ayni degildir. Degisken degeri rakam ise ya da baska bir degisken ise tirnak isareti (") kullanmaya gerek yoktur ama eger degeri harf ise ya da içeriginde harfler varsa deger verilirken tirnak isareti kullanilmasi gerekir.
Örnek :
#!/usr/bin/perl
# degisken1.cgi
print "Content-type:text/html\n\n";
$isim = "Hakan";
$site = "http://www.webdersleri.com";
print "Merhaba, benim adim $isim, su anda $site adresindesiniz.";
Sadece $isim ve $site degiskenlerinin içerikleriyle oynayarak alttaki yaziyi degistirebilirsiniz. Hata yapmamak için degisken adlarini küçük harfle, daha sonra hatirlayabileceginiz basitlikte vermenizde fayda vardir.
Ayrica tekil degiskenin içerigi rakam ise tirnak isareti olmadan da degiskene deger atayabilirsiniz.
Dizi (array) degiskenler;
Dizi degiskenleri bir küme gibi görebilirsiniz. Tekil degiskenlerden farkli olarak içinde belli sayida elemanlar vardir ve bu elemanlarla islem yapabilirsiniz. (silebilirsiniz, düzenleyebilirsiniz, yeni eleman ekleyebilirsiniz.) Dizi degiskenler at (@) isareti ile baslarlar. Isimlendirme kurallari tekil degisken ile aynidir. Harf, rakam ya da alt çizgi (_) ile isimlendirilmelidirler. Büyük küçük harf ayrimi söz konusudur.
Dizi degiskenler elemanlardan olusur dedik. Bu elemanlari dizi içerisindeki siralamasina göre tekil degisken olarak kullanabilirsiniz. Su an belki anlamsiz olarak görülebilir ama ileride veri dosyalari üzerinde çalisirken dizi degiskenleri çok kullanacaksiniz. Perl saymaya c dilleri gibi 0’dan baslar ve mesela @dizi isimli bir dizi degiskenimiz varsa $dizi[0] seklinde dizinin ilk elemanini, $dizi[3] seklinde dizinin 4 numarali elemanini kullanabilirsiniz.
Örnek:
#!/usr/bin/perl
# degisken2.cgi
print "Content-type:text/html\n\n";
@dizi = (’hakan’,’[email protected]’,’www.webdersleri.com’,’cgi/Perl’);
$isim = $dizi[0];
$mail = $dizi[1];
$site = $dizi[2];
$ilgi = $dizi[3];
print "<html><bOdy>";
print "Isim : $isim <br>";
print "Mail : $mail <br>";
print "Site: $site <br>";
print "Ilgi alanlari : $ilgi <br>";
print "</bOdy></html>";
Örnegimizde bir dizi degiskenin nasil atanacagini, içeriginin nasil ekrana yazdirilacagini gördünüz. Döngüler konusunda da dizi degiskenlerin döngü ile nasil kolayca ekrana yazdirilabilecegini görecegiz. Simdilik dizi degiskenler hakkinda bu kadar bilgi yeterli.
6.Iliskili dizi (hash) degiskenler :
Iliskili dizi degiskenin dizi degiskenden farki birbiriyle iliskili elemanlardan olusuyor olmasidir. Iliskili dizi degiskenlerde iki unsur vardir: anahtar (key) ve deger (value). Bir iliskili dizin ayni adda iki anahtara sahip olamaz ama ayni adda birden fazla deger bulunabilir.
%iliskili_dizi = ("anahtar1" => ‘deger1’
"anahtar2" => ‘deger2’
...
...
);
Iliskili dizinlerin kullanim alani dardir o yüzden sonraki derslerde daha çok dizi degiskenkleri (array) kullanacagiz. Simdilik iliskili diziler hakkinda kadar bilgi yeterli.
>>Ders 05 (Splice ve Split fonksiyonlari)
CGI/Perl Dersleri Splice ve Split Fonksiyonlari
Split fonksiyonu :
Bir önceki derste dizi degiskenleri görmüstük. Split fonksiyonu içerigini bildigimiz dizi ya da tekil degisken içerigini istedigimiz gibi kullanabilmemize olanak verir. Daha çok dosya ile yapilan islemlerde kullanilir. Üç argümani vardir, genelde iki argüman kullanilir.
"dizi yada tekil degisken" = split(/bölme karakteri/, bölünen degisken);
Öncelikle söyle bir degiskenimiz olsun:
$isimler = "ali veli mustafa ismail hasan";
Simdi bu tekil degiskeni bosluk isaretinden bölelim ve dizi degiskene atayalim :
@isim = split(/ /, $isimler);
print "$isim[0];
Örnek :
#!/usr/bin/perl
# split.cgi
print "Content-type:text/html\n\n";
$dizi = "ali|21|1980|samsun|lise";
($isim, $yas, $dtarihi, $dsehri, $mezuniyet) = split (/\|/, $dizi);
print "<html><bOdy bgcolor=\"#eeeeee\"><br>";
print "<font face=\"verdana\" size=\"2\">";
print "<b>Isim :</b> $isim<br>";
print "<b>Yas :</b> $yas<br>";
print "<b>Dogum Tarihi :</b> $dtarihi<br>";
print "<b>Dogdugu sehir :</b> $dsehri<br>";
print "<b>Mezuniyet derecesi :</b> $mezuniyet<br>";
print "</bOdy></html>";
Örnekte $dizi tekil degiskeninin içerigini "|" karakterinden split() fonksiyonu yardimiyla bölüyoruz ve 4 ayri degiskene atiyoruz. Daha sonra da bu degiskenleri teker teker ekrana yazdiriyoruz.
Splice Fonksiyonu
Splice fonksiyonunu kullanarak bir dizi degiskene eleman ekleme yada dizi degiskendeki belli bir elemani silme islemi yapabiliriz. Bu fonksiyonun 4 argümani vardir: Dizi degiskenin adi, eklenecek (ya da silinecek) elemanin sira numarasi, çikartilacak eleman sayisi, eklenecek elemanin içerigi. Kullanimi su sekildedir:
@dizi_degisken = (0, 1, 2, 3);
splice (@dizi_degisken, 4, 0, (4));
print "$dizi_degisken[4]";
Bu örnekte dizi degiskendeki hiç bir üyeyi atmadan listenin 4. sirasina (bu arada perl’ün saymaya sifirdan basladigini unutmadiniz umarim) "4" elemanini ekledik. Eger isterseniz hiç bir sey eklemeden belli bir üyeyi de silebilirsiniz:
splice (@dizi_degisken, 2, 1, ());
Böylece dizideki "2" elemani silindi.
Splice fonksiyonu da en çok dosya islemlerinde veritabanindaki belli bir kaydin düzenlenmesi ya da silinmesi için kullanilir.
Örnek :
#!/usr/bin/perl
# splice.cgi
print "Content-type:text/html\n\n";
@dizi = ("sifir","bir","iki","üç","dört","bes");
print "<html><bOdy>";
print "Dizinin su anki elemanlari:@dizi<br><br>";
splice(@dizi, 3, 1, (333));
print "Dizinin 3. elemaninin degismis hali: @dizi<br><br>";
splice(@dizi, 3, 1, ());
print "Dizinin 3. elemaninin silinmis hali: @dizi<br><br>";
print "</bOdy></html>";
7.CGI/PERL DERSLERI FORUMLARI KULLANMA:
Form verilerinin kullanilmasi :
Giris yazisinda belirttigim gibi CGI ile interaktif sayfalar olusturabilir, formdan gelen verileri kullanarak ziyaretcilerden bilgi ya da görüs ababilirsiniz. Peki html içindeki formdan gelen verileri nasil kullanacagiz? Bir html sayfasindaki form içine birseyler yazilip "submit" butonuna tiklaninca formun "action" hanesinde yazili olan dosyaya içine yazilan bilgileri teslim eder. Bu bilgileri alan dosya da programlamasi nasil yapilmissa ona göre bu bilgileri kullanir, kaydeder, mail ile gönderir ya da ekrana yazar.
HTML bildiginizi varsayarak form etiketinin unsurlari ve içerigi konularina girmiyorum. Form ile html üzerinden 2 türlü veri gönderilebilir: GET ve POST. Get metodu ile daha çok kisa veriler gönderilir ve programin yönlendirilmesinde kullanilir. Uzun bilgiler de gönderilebilse de veri kaybi riski yüzünden güvensizdir. Get metodunda veriler $ENV{QUERY_STRING}; çevre degiskeninde saklanir ve programa teslim edilir. Ayrica Post metodu ile gönderilen veriler browser adres çubugunda görüntülenir. POST metodu ise veriyi bir paket halinde $ENV{CONTENT_LENGTH}; çevre degiskeninde depolar ve programa teslim eder. Browser adres hanesinde görüntülenemez, veri kaybi riski yoktur ve büyük veriler için kullanilabilir. Ayrica formdan gelen verinin hangi metodla yollandigi $ENV{REQUEST_METHOD}; çevre degiskeninde saklanir.
Isim ve soyisim bölümlerinden olusan bir form içerigi programa su sekilde gönderilir:
isim=formiçerigi&soyisim=formiçerigi
Program gelen veriyi önce "&" isaretinden bölerek dizi degiskene, daha sonra da "=" isaretinden bölerek dizi degiskene atar.
Formdan gönderilen veriler 2 türlü degiskene atanip kullanilabilir.
Klasik Yöntem :
Bu yöntemde herhangi bir modül kullanilmadan gelen veri degiskene atanir. Bu yöntemle verileri atarken verinin gönderildigi metodu bilmek gereklidir. GET ve POST metodu ile gönderilen veriler ayri ayri çevre degiskenlerinde tutulduklarindan farkli kodlarla ayristirilir. Ayrica gelen veri degiskene atanirken bazi düzenlemeler de yapilmasi gerekir.
1) Post metodu ile gönderilen veriler:
Post metodu ile gönderilen veriler $ENV{’CONTENT_LENGTH’} çevre degiskeni içinde depolanip programa teslim edilirler. Bu veriler su sekilde bir kod kullanilarak açilir:
read(STDIN, $depo, $ENV{’CONTENT_LENGTH’});
@dizidegisken = split(/&/, $depo);
foreach $duzenle (@dizidegisken) {
($isim , $deger) = split(/=/, $duzenle);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~s///g;
$form{$isim} = $deger;
}
Bu islemlerden sonra mesela <input type=text name=isim> seklinde gönderilen bir veri $form{isim] seklinde kullanilabilir.
2) Get metodu ile gönderilen veriler :
GET metodu ile gönderin veriler $ENV{’QUERY_STRING’} çevre degiskeni içinde depolanip programa teslim edilir. Bu veriler su sekilde degiskene atanabilirler :
@girdi=split(/\&/,$ENV{’QUERY_STRING’});
foreach $depo (@girdi) {
($isim,$deger) = split(/=/,$depo);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$isim} = $deger;
}
Bu islemlerden sonra az önceki örnekteki gibi "name" bölümü "isim" olan inputdan gelen veri $form{isim} seklinde kullanilabilir.
Eger bir program içerisinde hem POST hem de GET metodunda veriler gönderilmisse söyle bir kod kullanilabilir:
@dizidegisken = split (/&/, $ENV{’QUERY_STRING’});
foreach $get(@dizidegisken) {
($isim, $deger) = split (/=/, $get);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~ tr/ //s;
$form{$isim} = $deger;
}
read(STDIN, $depo, $ENV{’CONTENT_LENGTH’});
@dizidegisken = split(/&/, $depo);
foreach $post (@dizidegisken) {
($isim , $deger) = split(/=/, $post);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$isim} = $deger;
}
Bu kodlardan sonra formdan gelen her iki metoddaki veriler de $form{isim} seklinde degiskene atanip kullanilabilirler.
Bu bilgiler dogrultusunda bir örnek program yapalim. Program iki veri türüyle de ayni bilgileri gönderecek (böylece iki metod arasindaki farki ve benzerlikleri görebilecegiz) formlardan olusacak, bu formlar kendi kendine veri gönderecek ve bu verileri açip ekrana yazdiracak:
#!/usr/bin/perl
# parse1.cgi
print "Content-type:text/html\n\n";
@dizidegisken = split (/&/, $ENV{’QUERY_STRING’});
foreach $get(@dizidegisken) {
($isim, $deger) = split (/=/, $get);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~ tr/ //s;
$form{$isim} = $deger;
}
read(STDIN, $depo, $ENV{’CONTENT_LENGTH’});
@dizidegisken = split(/&/, $depo);
foreach $post (@dizidegisken) {
($isim , $deger) = split(/=/, $post);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$isim} = $deger;
}
$isim = $form{isim};
$soyad = $form{soyad};
$sanatci = $form{sanatci};
$sarki = $form{sarki};
print "<h3>Gönderdiginiz veriler: </h3><br><br>";
print "<b>Isim : </b>$isim<br>";
print "<b>Soyad : </b>$soyad<br>";
print "<b>Sarkici : </b>$sanatci<br>";
print "<b>Sarki : </b>$sarki<br><br><br>";
print "<h3>Formlar :</h3><hr>";
print "<b>GET metoduyla :</b><br>";
print "<form action=parse1.cgi method=get>";
print "Isminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiginiz Sanatci : <input type=text name=sanatci><br>";
print "Sevdiginiz sarki : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder></form>";
print "<hr><b> POST metoduyla :</b><br>";
print "<form action=parse1.cgi method=post>";
print "Isminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiginiz Sanatci : <input type=text name=sanatci><br>";
print "Sevdiginiz sarki : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder>";
print "</form></bOdy></html>";
Klasik metod iyidir, herhangi bir modüle ihtiyaç duymaz, her ortamda çalisir. Ama modül kullanarak yukaridaki islemi daha basit ve kolay hale getirebiliriz.
CGI.pm modülü kullanarak form verilerini degiskene atama :
Modüller perl’de bazi isleri daha kolay ve kisa kodlarla yapmamiza olanak veren paketlerdir. Modüller konusuna ilerde deginilecegi için bu derste sadece CGI.pm modülünün kullanimini açiklamaya çalisacagim. CGI.pm modülü kullanarak gelen verileri açip degiskene atamak için öncelikle dosyanin basina (shebang’dan sonra) su kodu eklememiz gerekiyor:
use CGI qw(:standard);
Bu kodu ekleyerek CGI.pm modülünün bize verdigi kolayliklari kullanabiliriz. Daha sonra formdan gelen veriyi kullanabilmek için yeni bir CGI nesnesi olusturmaliyiz :
$query = new CGI;
CGI.pm modülünü kullanarak mesela "name" bölümü "isim" olan bir form verisini açmak için söyle bir kod kullanmamiz yeterlidir:
$isim = $query -> param(’isim’);
CGI.pm modülü kullanildiginda formdan gelen verinin POST ya da GET metodu ile gönderilmesinin bir önemi yoktur. Iki türde ayni sekilde açilip degiskene atanabilir.
Buna göre az önceki örnegi CGI.pm modülü kullanarak su sekilde yapabiliriz:
#!/usr/bin/perl
# parse2.cgi
use CGI qw(:standard);
print "Content-type:text/html\n\n";
$query = new CGI;
$isim = $query -> param(’isim’);
$soyad = $query -> param(’soyad’);
$sanatci = $query -> param(’sanatci’);
$sarki = $query -> param(’sarki’);
print "<html><bOdy>";
print "<h3>Gönderdiginiz veriler: </h3><br><br>";
print "<b>Isim : </b>$isim<br>";
print "<b>Soyad : </b>$soyad<br>";
print "<b>Sarkici : </b>$sanatci<br>";
print "<b>Sarki : </b>$sarki<br><br><br>";
print "<h3>Formlar :</h3><hr>";
print "<b>GET metoduyla :</b><br>";
print "<form action=parse2.cgi method=get>";
print "Isminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiginiz Sanatci : <input type=text name=sanatci><br>";
print "Sevdiginiz sarki : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder></form>";
print "<hr><b> POST metoduyla :</b><br>";
print "<form action=parse2.cgi method=post>";
print "Isminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiginiz Sanatci : <input type=text name=sanatci><br>";
print "Sevdiginiz sarki : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder>";
print "</form></bOdy></html>";
Gördügünüz gibi yukarida yaklasik 20 satir kodun yaptigi isi modül kullanarak 7 satirda hallettik. Günümüzde CGI.pm modülü CGI destegi olan hemen hemen her server’da desteklenir ve gelismis perl programlari da form verilerini bu yolla açarak kullanirlar. Bundan sonraki örneklerimizde de basitligi ve anlasilabilirligi açisindan CGI.pm modülü kullanilarak yapilacak.
8.CGI PERL DERSLERI ÇEVRE DEGISKENLERI:
Form verilerinin kullanilmasi :
Giris yazisinda belirttigim gibi CGI ile interaktif sayfalar olusturabilir, formdan gelen verileri kullanarak ziyaretcilerden bilgi ya da görüs ababilirsiniz. Peki html içindeki formdan gelen verileri nasil kullanacagiz? Bir html sayfasindaki form içine birseyler yazilip "submit" butonuna tiklaninca formun "action" hanesinde yazili olan dosyaya içine yazilan bilgileri teslim eder. Bu bilgileri alan dosya da programlamasi nasil yapilmissa ona göre bu bilgileri kullanir, kaydeder, mail ile gönderir ya da ekrana yazar.
HTML bildiginizi varsayarak form etiketinin unsurlari ve içerigi konularina girmiyorum. Form ile html üzerinden 2 türlü veri gönderilebilir: GET ve POST. Get metodu ile daha çok kisa veriler gönderilir ve programin yönlendirilmesinde kullanilir. Uzun bilgiler de gönderilebilse de veri kaybi riski yüzünden güvensizdir. Get metodunda veriler $ENV{QUERY_STRING}; çevre degiskeninde saklanir ve programa teslim edilir. Ayrica Post metodu ile gönderilen veriler browser adres çubugunda görüntülenir. POST metodu ise veriyi bir paket halinde $ENV{CONTENT_LENGTH}; çevre degiskeninde depolar ve programa teslim eder. Browser adres hanesinde görüntülenemez, veri kaybi riski yoktur ve büyük veriler için kullanilabilir. Ayrica formdan gelen verinin hangi metodla yollandigi $ENV{REQUEST_METHOD}; çevre degiskeninde saklanir.
Isim ve soyisim bölümlerinden olusan bir form içerigi programa su sekilde gönderilir:
isim=formiçerigi&soyisim=formiçerigi
Program gelen veriyi önce "&" isaretinden bölerek dizi degiskene, daha sonra da "=" isaretinden bölerek dizi degiskene atar.
Formdan gönderilen veriler 2 türlü degiskene atanip kullanilabilir.
Klasik Yöntem :
Bu yöntemde herhangi bir modül kullanilmadan gelen veri degiskene atanir. Bu yöntemle verileri atarken verinin gönderildigi metodu bilmek gereklidir. GET ve POST metodu ile gönderilen veriler ayri ayri çevre degiskenlerinde tutulduklarindan farkli kodlarla ayristirilir. Ayrica gelen veri degiskene atanirken bazi düzenlemeler de yapilmasi gerekir.
1) Post metodu ile gönderilen veriler:
Post metodu ile gönderilen veriler $ENV{’CONTENT_LENGTH’} çevre degiskeni içinde depolanip programa teslim edilirler. Bu veriler su sekilde bir kod kullanilarak açilir:
read(STDIN, $depo, $ENV{’CONTENT_LENGTH’});
@dizidegisken = split(/&/, $depo);
foreach $duzenle (@dizidegisken) {
($isim , $deger) = split(/=/, $duzenle);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~s///g;
$form{$isim} = $deger;
}
Bu islemlerden sonra mesela <input type=text name=isim> seklinde gönderilen bir veri $form{isim] seklinde kullanilabilir.
2) Get metodu ile gönderilen veriler :
GET metodu ile gönderin veriler $ENV{’QUERY_STRING’} çevre degiskeni içinde depolanip programa teslim edilir. Bu veriler su sekilde degiskene atanabilirler :
@girdi=split(/\&/,$ENV{’QUERY_STRING’});
foreach $depo (@girdi) {
($isim,$deger) = split(/=/,$depo);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$isim} = $deger;
}
Bu islemlerden sonra az önceki örnekteki gibi "name" bölümü "isim" olan inputdan gelen veri $form{isim} seklinde kullanilabilir.
Eger bir program içerisinde hem POST hem de GET metodunda veriler gönderilmisse söyle bir kod kullanilabilir:
@dizidegisken = split (/&/, $ENV{’QUERY_STRING’});
foreach $get(@dizidegisken) {
($isim, $deger) = split (/=/, $get);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~ tr/ //s;
$form{$isim} = $deger;
}
read(STDIN, $depo, $ENV{’CONTENT_LENGTH’});
@dizidegisken = split(/&/, $depo);
foreach $post (@dizidegisken) {
($isim , $deger) = split(/=/, $post);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$isim} = $deger;
}
Bu kodlardan sonra formdan gelen her iki metoddaki veriler de $form{isim} seklinde degiskene atanip kullanilabilirler.
Bu bilgiler dogrultusunda bir örnek program yapalim. Program iki veri türüyle de ayni bilgileri gönderecek (böylece iki metod arasindaki farki ve benzerlikleri görebilecegiz) formlardan olusacak, bu formlar kendi kendine veri gönderecek ve bu verileri açip ekrana yazdiracak:
#!/usr/bin/perl
# parse1.cgi
print "Content-type:text/html\n\n";
@dizidegisken = split (/&/, $ENV{’QUERY_STRING’});
foreach $get(@dizidegisken) {
($isim, $deger) = split (/=/, $get);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~ tr/ //s;
$form{$isim} = $deger;
}
read(STDIN, $depo, $ENV{’CONTENT_LENGTH’});
@dizidegisken = split(/&/, $depo);
foreach $post (@dizidegisken) {
($isim , $deger) = split(/=/, $post);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$isim} = $deger;
}
$isim = $form{isim};
$soyad = $form{soyad};
$sanatci = $form{sanatci};
$sarki = $form{sarki};
print "<h3>Gönderdiginiz veriler: </h3><br><br>";
print "<b>Isim : </b>$isim<br>";
print "<b>Soyad : </b>$soyad<br>";
print "<b>Sarkici : </b>$sanatci<br>";
print "<b>Sarki : </b>$sarki<br><br><br>";
print "<h3>Formlar :</h3><hr>";
print "<b>GET metoduyla :</b><br>";
print "<form action=parse1.cgi method=get>";
print "Isminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiginiz Sanatci : <input type=text name=sanatci><br>";
print "Sevdiginiz sarki : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder></form>";
print "<hr><b> POST metoduyla :</b><br>";
print "<form action=parse1.cgi method=post>";
print "Isminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiginiz Sanatci : <input type=text name=sanatci><br>";
print "Sevdiginiz sarki : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder>";
print "</form></bOdy></html>";
Klasik metod iyidir, herhangi bir modüle ihtiyaç duymaz, her ortamda çalisir. Ama modül kullanarak yukaridaki islemi daha basit ve kolay hale getirebiliriz.
CGI.pm modülü kullanarak form verilerini degiskene atama :
Modüller perl’de bazi isleri daha kolay ve kisa kodlarla yapmamiza olanak veren paketlerdir. Modüller konusuna ilerde deginilecegi için bu derste sadece CGI.pm modülünün kullanimini açiklamaya çalisacagim. CGI.pm modülü kullanarak gelen verileri açip degiskene atamak için öncelikle dosyanin basina (shebang’dan sonra) su kodu eklememiz gerekiyor:
use CGI qw(:standard);
Bu kodu ekleyerek CGI.pm modülünün bize verdigi kolayliklari kullanabiliriz. Daha sonra formdan gelen veriyi kullanabilmek için yeni bir CGI nesnesi olusturmaliyiz :
$query = new CGI;
CGI.pm modülünü kullanarak mesela "name" bölümü "isim" olan bir form verisini açmak için söyle bir kod kullanmamiz yeterlidir:
$isim = $query -> param(’isim’);
CGI.pm modülü kullanildiginda formdan gelen verinin POST ya da GET metodu ile gönderilmesinin bir önemi yoktur. Iki türde ayni sekilde açilip degiskene atanabilir.
Buna göre az önceki örnegi CGI.pm modülü kullanarak su sekilde yapabiliriz:
#!/usr/bin/perl
# parse2.cgi
use CGI qw(:standard);
print "Content-type:text/html\n\n";
$query = new CGI;
$isim = $query -> param(’isim’);
$soyad = $query -> param(’soyad’);
$sanatci = $query -> param(’sanatci’);
$sarki = $query -> param(’sarki’);
print "<html><bOdy>";
print "<h3>Gönderdiginiz veriler: </h3><br><br>";
print "<b>Isim : </b>$isim<br>";
print "<b>Soyad : </b>$soyad<br>";
print "<b>Sarkici : </b>$sanatci<br>";
print "<b>Sarki : </b>$sarki<br><br><br>";
print "<h3>Formlar :</h3><hr>";
print "<b>GET metoduyla :</b><br>";
print "<form action=parse2.cgi method=get>";
print "Isminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiginiz Sanatci : <input type=text name=sanatci><br>";
print "Sevdiginiz sarki : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder></form>";
print "<hr><b> POST metoduyla :</b><br>";
print "<form action=parse2.cgi method=post>";
print "Isminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiginiz Sanatci : <input type=text name=sanatci><br>";
print "Sevdiginiz sarki : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder>";
print "</form></bOdy></html>";
Gördügünüz gibi yukarida yaklasik 20 satir kodun yaptigi isi modül kullanarak 7 satirda hallettik. Günümüzde CGI.pm modülü CGI destegi olan hemen hemen her server’da desteklenir ve gelismis perl programlari da form verilerini bu yolla açarak kullanirlar. Bundan sonraki örneklerimizde de basitligi ve anlasilabilirligi açisindan CGI.pm modülü kullanilarak yapilacak.
10.CGI/PERL DERSLERI PERLDE MANTIKSAL SINAMA:
Perl’de Mantiksal Sinama :
Perl ile formdan gelen ya da bir sekilde elde ettigimiz veriyi mantiksal sinamaya tabi tutabilir ve programi buna göre yönlendirebiliriz. Perl’de mantiksal sinamalar su sekildedir:
Sayisal degerlerde mantiksal sinama :
Islem Anlami
x > y x büyüktür y’den
x < y x küçüktür y’den
x >= y x büyük esittir y’ye
x <= y x küçük esittir y’ye
x == y x esittir y’ye
x != y x esit degildir y’ye
Sayisal olmayan degerlerde mantiksal sinama:
Islem Anlami
a eq b a esittir b’ye
a ne b a esit degildir b’ye
a lt b a küçüktür b’den
a gt b a büyüktür b’den
a le b a küçük esittir b’ye
a ge b a büyük esittir b’ye
Buna göre perl’ile bir veri ya da degisken üzerinde mantiksal sinama yapmak için bu verinin ya da degiskenin içeriginin sayisal olup olmadigini bilmemiz gerekiyor.
Mantiksal sinama if, elsif, else fonksiyonlari :
Yukarida sayisal degerlerde ve sayisal olmayan degerlerde (string) karsilastirma operatörlerini gördünüz ama ne ise yaradiklarini bilmiyorsunuz. Bu operatörler perl’de karsilastirma yapmaya olanak verir ve bunu da if(), elsif() ve else() komutlariyla saglariz. Kullanimi su sekildedir:
if (kosul) {
kosul sonunda yapilacak islem
}
elsif(kosul) {
kosul sonunda yapilacak islem
}
else {
bu iki (ya da daha fazla) kosulun gerçeklesmemesi durumunda yapilacak islem
}
Buna göre iki rakami form vasitasiyla programa gönderelim, program bize bu iki rakami karsilastirip sonucunu ekrana yazsin :
#!/usr/bin/perl
# if1.cgi
use CGI qw(:standard);
print "Content-type:text/html\n\n";
$query = new CGI;
$ilksayi = $query -> param(’ilksayi’);
$sonsayi = $query -> param(’sonsayi’);
print "<html><bOdy>";
if ($ilksayi ne "" or $sonsayi ne "") {
if ($ilksayi == $sonsayi) {
print "ilksayi($ilksayi) ile ikinci sayi($sonsayi) esit!";
}
elsif ($ilksayi != $sonsayi) {
print "ilksayi ($ilksayi) ile ikinci sayi($sonsayi) esit degil!";
}
}
print "<br>";
print "<form action=if1.cgi method=post>";
print "Birinci sayi: <input type=text name=ilksayi><br>";
print "Ikinci sayi: <input type=text name=sonsayi>";
print "<input type=submit value=Karsilastir>";
print "</bOdy></html>";
Ilk "if" karsilastirmasi dikkatinizi çekti mi? Bu ilk karsilastirma sayesinde eger formdan veri gelmemisse sadece form görünüyor, formdan veri gelmisse karsilastirma yapiliyor ve altinda yine form gösteriliyor böylece programin saçmalamasini önlüyoruz.
Ayni seyi bir de sayisal olmayan degerlerle, yani harflerle yapalim. Mesela formdan gönderilen veriler bizim ismimize esitse ekrana "Senin isminle benim ismim ayni, biz adasiz" yazdiralim, degilse "isimlerimiz ayni degil, biz adas degiliz" yazdiralim :
#!/usr/bin/perl
# if2.cgi
$benim_ismim = "hakan";
use CGI qw(:standard);
print "Content-type:text/html\n\n";
$query = new CGI;
$isim = $query -> param(’isim’);
print "<html><bOdy>";
if ($isim ne "") {
if ($isim eq $benim_ismim) {
print "Bizim isimlerimiz ayni, biz adasiz!";
}
elsif ($isim ne $benim_ismim) {
print "Isimlerimiz ayni degil, biz adas degiliz";
}
}
Yukaridaki örnekte $benim_ismim degiskenini kendi adinizla ya da baska adlarla degistirerek sinama yapabilirsiniz.
CGI/Perl Dersleri Matematiksel Islemler
Perl’de matematiksel islemler :
Matematik ile araniz nasil bilmiyorum ama gerçek CGI programlari yazmaya basladiginizda programlarinizin içinde mutlaka matematiksel islemler yapmak zorunda kalacaksiniz. Bu islemler çok karmasik islemler olabilecegi gibi degiskenleri toplama, çikarma, döngü sirasinda bir deger arttirma seklinde de olabilir. Bu derste perl ile yapabilecegimiz matematiksel islemleri ele alacagiz.
Perl ile dört islem :
Perl ile sayilari ya da sayi içerikli degiskenleri toplayabilir, çikarabilir, bölebilir ya da çarpabiliriz. Örnegin elimizde su degiskenler var :
$a = 1;
$b = 2;
$c = 3;
$d = 4;
Önce $a ile $b’yi toplayalim :
$sonuc = $a + $b;
print $sonuc;
Bu kod ekrana $sonuc degiskenin degerini yani "3" yazdiracaktir. $b degiskeninden $a degiskenini çikarmak için ise söyle bir kod yazmamiz gerekir :
$sonuc = $b - $a;
print $sonuc;
Bu kod da ekrana "1" yazdiracaktir. Çarpma islemi ise su sekilde :
$sonuc = $b * $d;
print $sonuc;
Bu kod da $b degiskeni ile $d degiskenlerinin degerlerini çarpip sonucu $sonuc degiskenine atar ve ekrana "8" yazdirir. Bölme islemi ise su sekilde :
$sonuc = $d / $b;
print $sonuc;
Bu kod da $d degiskeninin degerini $b degiskeninin degerine böler (4 / 2), sonucu $sonuc degiskenine atar ve ekrana yazdirir. Eger birden fazla islem yapmak istiyorsak, mesela önce $a, $b, ve $c degiskenlerini toplayip sonuçtan $d degiskenini çikarmak istiyorsak su sekilde bir kod kullanmamiz gerekir :
$sonuc = ($a + $b + $c) - $d;
print $sonuc;
Bu kodla program önce $a, $b ve $c degiskenlerinin degerlerini toplar, sonra çikan sonuçtan $d degiskeninin degerini çikarir ve sonucu (6-4 = 2) ekrana yazar.
Dört islem için bu kadar örnek fazla bile. Simdi ögrendigimiz bilgilerden daha "ise yarar" bir örnek yapalim. Örnegimiz formdan gelen iki sayi üzerinde islem yapsin. Bu islem yine ziyaretcinin (yani bizim) seçtigimiz islem olsun. Yani kisaca dört islem yapabilen basit bir hesap makinasi yapalim :
#!/usr/bin/perl
# hesapla.cgi
use CGI qw(:standard);
print "Content-type:text/html\n\n";
$query = new CGI;
$sayi1 = $query -> param(’sayi1’);
$sayi2 = $query -> param(’sayi2’);
$islem = $query -> param(’islem’);
print "<html><bOdy>";
if ($islem ne "") {
if ($islem eq "topla") {
$sonuc = $sayi1 + $sayi2;
print "Islem sonucu : $sonuc";
}
elsif ($islem eq "cikar") {
$sonuc = $sayi1 - $sayi2;
print "Islem Sonucu : $sonuc";
}
elsif ($islem eq "bol") {
$sonuc = $sayi1 / $sayi2;
print "Islem Sonucu : $sonuc";
}
elsif ($islem eq "carp") {
$sonuc = $sayi1 * $sayi2;
print "Islem Sonucu : $sonuc";
}
}
print "<form action=hesapla.cgi method=post>";
print "<input type=text name=sayi1> sayisi ile ";
print "<input type=text name=sayi2> sayisini ";
print "<select name=islem>";
print "<option value=topla>Topla<br>";
print "<option value=cikar>Çikar<br>";
print "<option value=bol>Böl<br>";
print "<option value=carp>Çarp<br>";
print "</select>";
print "<input type=submit value=YAP!>";
print "</form>";
print "</bOdy></html>";
Perl ile ileri matematik islemleri de yapabilirsiniz. Mesela :
$sayi = 12;
$karekok = sqrt($sayi);
print $karekok;
Bu kod sqrt() fonksiyonu ile $sayi degiskeninin degerini $karekok degiskeninin degerine atar ve ekrana 12’nin karekökünü yazdirir.
$sayi = 12;
$log = log($sayi);
print $log;
Bu kod log() fonksiyonunu kullanarak $sayi degiskeninin logaritmasini alir, $log degiskenine atar ve ekrana yazdirir. Ayni sekilde exp() fonksiyonu ile sayinin exponensiyelini, int() fonksiyonu ile sayinin integerini, abs() fonksiyonu ile sayinin mutlak degerini bulabilirsiniz... SELAMETLE...