PERL NEDİR ?
PERL VERİ YAPILARI
OPERATÖRLER
PERL FONKSİYONLARI
ÖZEL DEĞİŞKENLERDEN BAZILARI
ALT PROGRAMLAR
MODULLER
PERL VE CGI
PERL NEDİR ?
Practical Extraction and Report Language
LARRY WALL TARARAFINDAN GELİŞTİRİLEN BİR DİL
BİRÇOK PLATFORMDA MEVCUT
YORUMLANARAK ÇALIŞAN BİR DİL
BİRÇOK BAŞKA ARACIN VE DİLİN ÖZELLİLERİNİ ALMIŞ VE/VEYA BERABER KULLANILABİLEN BİR ORTAM (AWK C v.b.)
ASIL KUVETİNİ KÜTÜPHANELERİNDEN ALMAKTA
ÇOK BASİTTEN ÇOK KARMAŞIĞA KADAR KULLANIM ALANI BULUNMAKTA
PERL VERİ YAPILARI
DEĞİŞKENLER
$değişkenismi ŞEKLİNDE GÖSTERİLİRLER.
SAYISAL YA DA KAREKTER İÇERİĞE SAHİP OLABİLİRLER.
MANTIKSAL İÇERİK OLARAK ALINDIĞINDA DEĞİŞKENİN BİR DEĞERE SAHİP OLMASI DOĞRU BOŞ (NULL) DEĞERE SAHİP OLMASI YANLIŞ ANLAMINA GELİR.
$i = 3;
$yazi = "Bu değişkenin ismi yazi'dir.";
$k = "5";
$flag = "";
DİZİLER
@diziismi ŞEKLİNDE TÜM DİZİ
$diziismi[3] ŞEKLİNDE DİZİNİN 3. ELEMANI KASTEDİLİR.
@dizi = ( 1 2 "text" 7);
print $dizi[0]; # 1 yazar
print $dizi[2]; # text yazar
print $dizi[-1]; # 7 yazar
İLİŞKİLER (HASH)
İNDEX OLARAK KARAKTER DİZİLERİNİ KULLANAN DİZİLERDİR.
%hash ŞEKLİNDE GÖSTERİLİR.
%sesi = ( 'köpek' 'havlar' 'kedi' 'miyavlar' 'kuzu' 'meler');
print $sesi{'kedi'}; # miyavlar yazar
OPERATÖRLER
+ ++ - -- * ** / GİBİ ARİTMETİK OPERATÖRLERİ
< > <= >= lt gt le ge == != <=> eq ne cmp GİBİ KARŞILAŞTIRMA İÇİN KULLANILAN OPERATÖRLER
&& || not or xor GİBİ MANTIKSAL OPERATÖLER.
KARAKTER DİZİLERİ ÜZERİNDE İŞLEM YAPAN OPERATÖRLER
q/STRING/ ---> 'STRING'
qq/STRING/ ---> "STRING"
STRING1.STRING2 ----> STRING1STRING2
PERL FONKSİYONLARI
DEĞİŞKEN VE KAREKTER DİZİLERİ FONKSİYONLARI
index hex substr uc.
ARAMA VE EŞLEŞTİRME FONKSİYONLARI
s/// split.
SAYISAL FONKSİYONLAR
abs rand cos.
DİZİ FONKSİYONLARI
push shift.
LİSTE VERİ İÇİN FONKSİYONLAR
reverse sort.
EŞLEMELER İÇİN FONKSİYONLAR
each keys values.
GİRDİ ÇIKTI FONKSİYONLARI
print write read.
DOSYA - DİZİN İŞLEMLERİ FONKSİYONLARI
chmod open rmdir.
PROGRAM AKIŞI İLE İLGİLİ ANAHTAR KELİMELER
goto exit next.
DEĞİŞKEN GEÇERLİLİĞİ İLE İLGİLİ ANAHTAR KELİMELER
my local import.
SÜREÇLER İLE İLGİLİ FONKSİYONLAR
fork waitpid.
NETWORK VE SOKET FONKSİYONLARI
gethostbyname listen.
DİĞER FONKSİYONLAR
getlogin time.
ÖZEL DEĞİŞKENLERDEN BAZILARI
$ARG $_ @_
@INC %INC
%ENV
$ERRNO $!
ALT PROGRAMLAR
sub ANAHTAR KELİMESİYLE TANIMLANIR
sub ISIM;
sub ISIM(PROTO);
sub ISIM BLOCK
sub NAME(PROTO) BLOCK
PROROTİPLEMEYE İZİN VERİR
sub buyukkucuk($$){}
return ANAHTAR KELİMESİYLE DEĞER DÖNDÜREBİLİR. DÖNDÜRÜLECEK BİRDEN ÇOK DEĞER VARSA BİR DİZİ KULLANILARAK DÖNDÜRÜLEBİLİNİR.
my ANAHTAR KELİMESİYLE TANIMLANAN DEĞİŞKENLER SADECE O BLOK BOYUNCA GEÇERLİDİR.
@_ DİZİSİ ALT PROGRAMA GÖNDERİLEN PARAMETRELERİ İÇERİR.
sub buyuk($$){
my $birinci = $_[0];
my $ikinci = $_[1];
if (birinci gt $ikinci) {
return $birinci;
}
elsif{
return $ikinci;
}
}
ALT PROGRAMLAR EĞER MODÜLLERDEN ÇAĞIRILACAKSA MUTLAKA YEREL DEĞİŞKEN TANIMLARI YAPILMALIDIR.
MODÜLLER
ALT PROGRAMLARIN TOPLANDIĞI KİTAPLIKLARDIR.
CPAN ARŞİVİNDEN GENİŞ BİR KİTAPLIK DESTEĞİ ALINABİLİR
package SEMINER:rnek;
# SEMINER/ornek.pm dosyası
use Exporter ();
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
$VERSION = 0.1;
@ISA = qw(Exporter);
@EXPORT = qw( &sub1 &sub2 &sub3);
%EXPORT_TAGS = ( );
@EXPORT_OK = qw($degisken1);
use vars @EXPORT_OK;
sub sub1{
.
.
.
}
sub sub2{
.
.
.
}
sub sub3{
.
.
.
}
sub sub4{
.
.
.
}
1;
__END__
Ana program
use SEMINER:rnek;
sub1();
PERL VE CGI
HAZIR CGI KİTAPLIĞI İLE FORM VE DİNAMİK WEB SAYFASI HAZIRLAMA KOLAYLIĞI
WEB TARAYICISI DEĞİŞKENLERİNE KOLAY ERİŞİM.
VERİTABANI ARAYÜZLERİ SAYESİNDE WEB OTOMASYON PROJELERİNDE KULLANIM.
CGI ile neler yapabiliriz?
CGI dosyaları az önce de belirttiğim gibi server'a bir takım komutlar verip "iş" yaptıran programcıklardır. CGI dosyalarıyla web sitenizin ziyaretcilerle etkileşimini sağlayabilirsiniz. Onların görüşlerini ve önerilerini öğrenebilirsiniz. Bir takım bilgiler alıp dosyalara kaydettirebilir daha sonra bu dosyaları inceleyip ziyaretcilerinizin görüşlerini öğrenebilirsiniz. Anket programlarıyla insanların istediğiniz konu hakkında düşüncelerini ve oranları öğrenebilirsiniz. Ziyaretci defteri hazırlayıp ziyaretcilerinizin görüşlerini alabilirsiniz. Forum programlarıyla insanların bilgilerini paylaşabilecekleri ortamlar hazırlayabilirsiniz. Mail formlarla ziyaretcileriniz web üzerinden size e-mail gönderebilmelerini sağlayabilirsiniz. Bunun dışında Toplist mesaj tahtası vs. gibi programlarla hem web sitenize içerik katarsınız hem de ziyaretci sayınızı arttırabilirsiniz.
Perl ile sadece internette değil kendi bilgisayarınızda çalışan bi takım işlerinizde pratiklik kazandıracak programlar da yapabilirsiniz.
Perl öğrenmek zor ve zahmetlidir ama sonucunda bir "programlama dili" öğrenmiş olursunuz ve ilerde başka bir programlama diline geçtiğinizde özellikle döngüler ve değişkenler konusunda çok rahat edersiniz.
Perl öğrenmek için ortalama html bilgisine (genel kodlar özellikle form ve input etiketleri) sahip olmanız gerekiyor.
Buradaki örnek kodları mecbur kalmadıkca ya da kendi yazdığınız kodlarla karşılaştırmak gerekmedikce kullanmamanızı tavsiye ederim kodları kendiniz yazarsanız hem eliniz alışır hem de hata yapa yapa hata yapmamayı hatasız kod yazmayı öğrenirsiniz. Örnek kodları zip'li halde buraya tıklayıp indirebilirsiniz.
PERL DE MANTIKSAL SINAMA
Perl'de Mantıksal Sınama :
Perl ile formdan gelen ya da bir şekilde elde ettiğimiz veriyi mantıksal sınamaya tabi tutabilir ve programı buna göre yönlendirebiliriz. Perl'de mantıksal sınamalar şu şekildedir:
>Sayısal değerlerde mantıksal sınama :
İşlem Anlamı
x > y x büyüktür y'den
x < y x küçüktür y'den
x >= y x büyük eşittir y'ye
x <= y x küçük eşittir y'ye
x == y x eşittir y'ye
x != y x eşit değildir y'ye
>Sayısal olmayan değerlerde mantıksal sınama:
İşlem Anlamı
a eq b a eşittir b'ye
a ne b a eşit değildir 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 eşittir b'ye
a ge b a büyük eşittir b'ye
Buna göre perl'ile bir veri ya da değişken üzerinde mantıksal sınama yapmak için bu verinin ya da değişkenin içeriğinin sayısal olup olmadığını bilmemiz gerekiyor.
>Mantıksal sınama if elsif else fonksiyonları :
Yukarıda sayısal değerlerde ve sayısal olmayan değerlerde (string) karşılaştırma operatörlerini gördünüz ama ne işe yaradıklarını bilmiyorsunuz. Bu operatörler perl'de karşılaştırma yapmaya olanak verir ve bunu da if() elsif() ve else() komutlarıyla sağlarız. Kullanımı şu şekildedir:
if (koşul) {
koşul sonunda yapılacak işlem
}
elsif(koşul) {
koşul sonunda yapılacak işlem
}
else {
bu iki (ya da daha fazla) koşulun gerçekleşmemesi durumunda yapılacak işlem
}
Buna göre iki rakamı form vasıtasıyla programa gönderelim program bize bu iki rakamı karşılaştırıp sonucunu ekrana yazsın :
#!/usr/bin/perl
# if1.cgi
use CGI qw(tandard);
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 "ilksayı($ilksayi) ile ikinci sayı($sonsayi) eşit!";
}
elsif ($ilksayi != $sonsayi) {
print "ilksayı ($ilksayi) ile ikinci sayı($sonsayi) eşit değil!";
}
}
print "<br>";
print "<form action=if1.cgi method=post>";
print "Birinci sayı: <input ******text name=ilksayi><br>";
print "İkinci sayı: <input ******text name=sonsayi>";
print "<input ******submit value=Karşılaştır>";
print "</body></html>";
İlk "if" karşılaştırması dikkatinizi çekti mi? Bu ilk karşılaştırma sayesinde eğer formdan veri gelmemişse sadece form görünüyor formdan veri gelmişse karşılaştırma yapılıyor ve altında yine form gösteriliyor böylece programın saçmalamasını önlüyoruz.
Aynı şeyi bir de sayısal olmayan değerlerle yani harflerle yapalım. Mesela formdan gönderilen veriler bizim ismimize eşitse ekrana "Senin isminle benim ismim aynıbiz adaşız" yazdıralım değilse "isimlerimiz aynı değil biz adaş değiliz" yazdıralım :
#!/usr/bin/perl
# if2.cgi
$benim_ismim = "hakan";
use CGI qw(tandard);
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 aynı biz adaşız!";
}
elsif ($isim ne $benim_ismim) {
print "İsimlerimiz aynı değil biz adaş değiliz";
}
}
Perl'de matematiksel işlemler :
Matematik ile aranız nasıl bilmiyorum ama gerçek CGI programları yazmaya başladığınızda programlarınızın içinde mutlaka matematiksel işlemler yapmak zorunda kalacaksınız. Bu işlemler çok karmaşık işlemler olabileceği gibi değişkenleri toplama çıkarma döngü sırasında bir değer arttırma şeklinde de olabilir. Bu derste perl ile yapabileceğimiz matematiksel işlemleri ele alacağız.
Perl ile dört işlem :
Perl ile sayıları ya da sayı içerikli değişkenleri toplayabilir çıkarabilir bölebilir ya da çarpabiliriz. Örneğin elimizde şu değişkenler var :
$a = 1;
$b = 2;
$c = 3;
$d = 4;
Önce $a ile $b'yi toplayalım :
$sonuc = $a + $b;
print $sonuc;
Bu kod ekrana $sonuc değişkenin değerini yani "3" yazdıracaktır. $b değişkeninden $a değişkenini çıkarmak için ise şöyle bir kod yazmamız gerekir :
$sonuc = $b - $a;
print $sonuc;
Bu kod da ekrana "1" yazdıracaktır. Çarpma işlemi ise şu şekilde :
$sonuc = $b * $d;
print $sonuc;
Bu kod da $b değişkeni ile $d değişkenlerinin değerlerini çarpıp sonucu $sonuc değişkenine atar ve ekrana "8" yazdırır. Bölme işlemi ise şu şekilde :
$sonuc = $d / $b;
print $sonuc;
Bu kod da $d değişkeninin değerini $b değişkeninin değerine böler (4 / 2) sonucu $sonuc değişkenine atar ve ekrana yazdırır. Eğer birden fazla işlem yapmak istiyorsak mesela önce $a $b ve $c değişkenlerini toplayıp sonuçtan $d değişkenini çıkarmak istiyorsak şu şekilde bir kod kullanmamız gerekir :
$sonuc = ($a + $b + $c) - $d;
print $sonuc;
Bu kodla program önce $a $b ve $c değişkenlerinin değerlerini toplar sonra çıkan sonuçtan $d değişkeninin değerini çıkarır ve sonucu (6-4 = 2) ekrana yazar.
Dört işlem için bu kadar örnek fazla bile. Şimdi öğrendiğimiz bilgilerden daha "işe yarar" bir örnek yapalım. Örneğimiz formdan gelen iki sayı üzerinde işlem yapsın. Bu işlem yine ziyaretcinin (yani bizim) seçtiğimiz işlem olsun. Yani kısaca dört işlem yapabilen basit bir hesap makinası yapalım :
#!/usr/bin/perl
# hesapla.cgi
use CGI qw(tandard);
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 "İşlem sonucu : $sonuc";
}
elsif ($islem eq "cikar") {
$sonuc = $sayi1 - $sayi2;
print "İşlem Sonucu : $sonuc";
}
elsif ($islem eq "bol") {
$sonuc = $sayi1 / $sayi2;
print "İşlem Sonucu : $sonuc";
}
elsif ($islem eq "carp") {
$sonuc = $sayi1 * $sayi2;
print "İşlem Sonucu : $sonuc";
}
}
print "<form action=hesapla.cgi method=post>";
print "<input ******text name=sayi1> sayısı ile ";
print "<input ******text name=sayi2> sayısını ";
print "<select name=islem>";
print "<option value=topla>Topla<br>";
print "<option value=cikar>Çıkar<br>";
print "<option value=bol>Böl<br>";
print "<option value=carp>Çarp<br>";
print "</select>";
print "<input ******submit value=YAP!>";
print "</form>";
print "</body></html>";
Perl ile ileri matematik işlemleri de yapabilirsiniz. Mesela :
$sayi = 12;
$karekok = sqrt($sayi);
print $karekok;
Bu kod sqrt() fonksiyonu ile $sayi değişkeninin değerini $karekok değişkeninin değerine atar ve ekrana 12'nin karekökünü yazdırır.
$sayi = 12;
$log = log($sayi);
print $log;
Bu kod log() fonksiyonunu kullanarak $sayi değişkeninin logaritmasını alır $log değişkenine atar ve ekrana yazdırır. Aynı şekilde exp() fonksiyonu ile sayının exponensiyelini int() fonksiyonu ile sayının integerini abs() fonksiyonu ile sayının mutlak değerini bulabilirsiniz.
Perl ile dosya işlemleri :
Perl sunucu tarafında çalışan bir dildir dedik. Perl vasıtası ile sunucu tarafında yani web alanında dosya açabilir açtığımız dosyaya kayıt yapabilir -ya da ekleme yapabilir- dosyadan belli bir kaydı silebilir ya da dosyayı silebiliriz. Perl'in bize sağladığı bu olanağı kullanarak açtığımız herhangi bir dosyayı veritabanı olarak kullanabiliriz. Perl ile server'da varolan ya da varolmayan bir dosyayı open() fonksiyonu kullanarak açarız. open() fonksiyonu ile dosyayı açtıktan sonra dosyayı bir "file handle" olarak tanımlar ve dosya üzerinde işlem yapıp dosyayı kapatana kadar da bu "file handle" ı kullanırız.
Yeni dosya oluşturma ve kayıt yapma :
Dosyayı açtıktan sonra formdan gelen ya da herhangi bir şekilde elde ettiğimiz veriyi istediğimiz formatta dosyaya print "."; şeklinde yazdırabiliriz. Bunun için eğer dosyaya yazarken eski bilgilerin üzerine yazılmasını eski bilgilerin silinmesini istiyorsanız open fonksiyonu şu şekilde kullanılmalıdır:
open (HANDLE ">dosya.dat");
HANDLE yazan yer "file handle" dediğimiz daha sonra dosya üzerinde işlem yaparken kullanacağımız takma isimdir. Dosyalara isim verirken Türkce karakter kullanılmaz küçük harf kullanmanın bir sakıncası olmamasına karşın genelde büyük harf kullanılır. Dediğim gibi dosyaya yazarken eski bilgilerin silinmesini istiyorsanız dosyayı açarken dosyadan önce bir tane büyüktür (>) işareti kullanmanız gereklidir. Eğer kayıt yaparken eski dosyadaki bilgileri muhafaza etmek istiyorsanız dosya adından önce iki tane büyüktür (>>) işareti kullanmanız gerekir.
open (HANDLE ">>dosya.dat");
Bu şekilde dosyaya yazdırdığınız bilgiler eski bilgilerin üzerine değil bir alt satırına kaydedilir.
Örnek :
#!/usr/bin/perl
# dosya1.cgi
use CGI qw(tandard);
print "Content-type:text/html\n\n";
$query = new CGI;
$isim = $query -> param('isim');
$soyad = $query -> param('soyad');
if ($isim eq "" or $soyad eq "") {
print "<html><body>";
print "<br>";
print "<form action=dosya1.cgi method=post>";
print "Lütfen isminizi yazın: <input ******text name=isim><br>";
print "Lütfen soyadınızı yazın: <input ******text name=soyad><br>";
print "<input ******submit value=Yolla!></form></body></html>";
exit;
}
open (DOSYA ">>veri.txt");
print DOSYA "$isim|$soyad\n";
close (DOSYA);
print "Verdiğiniz bilgiler başarıyla <a href=veri.txt>veritabanına</a> kaydedildi.";
Örnekte isim ve soyad isteyen verildiğinde bu isim ve soyadı "|" karakteri ile ayırıp dosyaya kaydeden bir program yaptık. Program her "Yolla" butonuna bastığınızda gönderdiğiniz isim ve soyadı programla aynı klasördeki "veri.txt" dosyasına kaydedecek eğer böyle bir dosya yoksa oluşturup öyle kaydedecektir. Daha sonra bu veritabanını "|" karakterinden bölerek ekrana yazdırabiliriz. Eğer dosyayı açarken iki büyüktür (>>) yerine sadece bir tane kullansaydık program her seferinde veri tabanına sadece bir tane kayıt yapardı.
Dosya açıp dosya içeriğini ekrana yazdırma :
Daha önce kayıt yapılmış bir dosya içeriğinin ekrana yazdırılması için şu işlemler yapılır: önce open() fonksiyonu kullanılarak dosya açılır dosya içeriği bir değişkene (tek satırsa tekil birden fazla satırsa dizi) atanır daha sonra close () fonksiyonu ile açılan dosya kapatılır bu dizi değişken direk print "@dizi"; şeklinde ya da bir döngü kullanılarak ekrana yazdırılır. Dosya açılırken dosya adından önce hiç işaret kullanılmaz ya da bir tane küçüktür (<) işareti kullanılır. Dizi değişken ekrana yazdırılırken veri dosyası içeriğine göre belli yerlerden (örneğimizde "|" karakterinden) split () fonksiyonu yardımıyla bölüm değişkene atanabilir.
Örnek :
#!/usr/bin/perl
# dosya2.cgi
print "Content-type:text/html\n\n";
open (DOSYA "veri.txt");
@veriler = <DOSYA>;
close (DOSYA);
print "Veritabanı içeriği<br><br>";
print "İsim - Soyad<br>";
foreach $dongu (@veriler) {
($isim $soyad) = split (/\|/ $dongu);
print "$isim - $soyad<br>";
}
Örnekte bir öneki örnekte oluşturduğumuz veritabanı dosyasını açtık @veriler dizi değişkenine atadık dizi değişken için foreach döngüsü oluşturduk döngü boyunca satırları split () fonksiyonu ile "|" karakterinden bölüp $isim ve $soyad adlı değişkenlere atadık ve bu değişkenleri teker teker ekrana yazdırdık.
Perl ile web üzerinden mail gönderme :
Perl ile linux server'larda (genelde CGI/Perl destekleyen server'lar linux işletim sistemi kullanır) sendmail programı kullanılarak direk web üzerinden herhangi ek program kullanmadan ziyarecti tarafından mail gönderilmesini ya da programın kendi kendinin bir şart oluştuğunda size ya da programın gidişatına bağlı olarak başka bir kimseye mail gönderilmesini sağlayabilirsiniz.
Sendmail :
Sendmail programı Linux server'larda web üzerinden mail gönderilebilmesine olanak veren bir programdır. Bu program aracılığıyla yazdığımız CGI programları ile web üzerinden mail gönderebilmemiz için sendmail'in linux server'ına göre tam yolunu bilmemiz gereklidir. Bu yol genellikle şu şekillerdedir :
/usr/sbin/sendmail
/usr/bin/sendmail
Eğer server'daki sendmail yolunu bilmiyorsanız sunucu anasayfasında sunucu ile ilgili sıkca sorulan sorular bölümünde (FAQ) bulabilirsiniz ya da server adminlerine yazıp öğrenebilirsiniz. Windows altında sendmail programı bulunmadığı için az sonra yapacağımız yöntemle windows altında mail gönderemezsiniz.*
Mail göndermek için önce mail programını open (MAIL "|/usr/sbin/sendmail"); şeklinde mail programını açarsınız daha sonra aynen mail gönderiyormuş gibi şu bölümlere gerekli yazıları ya da değişkenleri yazarsınız:
print MAIL "From: kimden\@mail.com";
Bu bölüme mailin kimden gönderildiğini yazmanız gerekiyor.
print MAIL "To\:kime\@mail.com\n";
Buraya mailin hangi adrese gitmesini istiyorsanız onu yazmalısınız.
print MAIL "Subject\: Mesajın konusu\n\n";
Bu bölüme de mailin "Subject/Konu" bölümünde yazmasını istediğiniz şeyi girmelisiniz.
print MAIL "Bu mail web üzerinden otomatik olarak gönderilmiştir vs. vs. vs.\n\n";
Bu bölüme mail içeriğini yazmalısınız.
close (MAIL);
Son olarak da mail programını aynen dosya işlemleri gibi kapatıyoruz.
Dikkat etmemiz gereken en önemli nokta sendmail yolu. Eğer bu yol yanlış ya da eksik yazılırsa mail gitmez. Mail gönderirken değişkenleri kullanabilirsiniz ama eğer bir tekil değişkene e-mail atamanız gerekiyorsa "@" işaretinin önüne ters slash (\) koymanız gerekir. Aksi taktirde mail programı değişkeni yanlış algılar ve mail istenildiği şekilde gönderilemez.
Buraya kadar anlamamış olabilirsiniz bir örnek yaparsak ne kadar kolay olduğunu anlayacaksınız. Örneğimizde web sitemiz üzerinden bize mail gönderilmesini olanak sağlayan bir form-mail programı yapalım. Ziyaretci kendi mail adresini ve mesaj konusunu girsin mesajını girsin ve formu göndersin gönderilen bilgiler de bizim mail adresimize ulaştırılsın. Tabii bizim mail adresini de program içerisinde bir tekil değişken olarak tanımlamamız gerekiyor :
#!/usr/bin/perl
# mail.cgi
print "Content-type:text/html\n\n";
$adresim = "isminiz\@mailiniz.com";
$sendmail = "/usr/sbin/sendmail";
use CGI qw(tandard);
$query = new CGI;
$gonderen = $query -> param('gonderen');
$konu = $query -> param('konu');
$mesaj = $query -> param('mesaj');
$istem = $query -> param('istem');
if ($istem eq "gonder") {
if ($gonderen eq "" or $konu eq "" or $mesaj eq "") {
print "Mail adresiniz mail konusu ya da mesaj bölümü boş bırakılmış.
Bu bölümleri doldurmanız zorunludur. Lütfen geri dönüp tekrar deneyin.";
exit;
}
open (MAIL "|$sendmail");
print MAIL "From\: $gonderen\n";
print MAIL "To\:$adresim\n";
print MAIL "Subject\: $konu\n\n";
print MAIL "Siteniz iletişim sayfasından gönderildi:\n\n";
print MAIL "$mesaj\n\n";
print MAIL "\n";
close (MAIL);
print "Mesajınız başarıyla gönderildi en kısa zamanda cevap verilecek.
Teşekkür ederim.";
exit;
}
print "<form action=mail.cgi method=post>";
print "<input ******hidden name=istem value=gonder>";
print "Bize ulaşmak için aşağıdaki formu doldurun :<br><br>";
print "<table width=500 cellpadding=0 cellspacing=0 border=0>";
print "<tr>";
print "<td width=50\%>";
print "Mail adresiniz : ";
print "</td>";
print "<td width=50\%>";
print "<input ******text name=gonderen>";
print "</td>";
print "</tr>";
print "<tr>";
print "<td>";
print "Konu :";
print "</td>";
print "<td>";
print "<input ******text name=konu>";
print "</td>";
print "</tr>";
print "<tr>";
print "<td>";
print "Mesajınız :";
print "</td>";
print "<td>";
print "<textarea name=mesaj></textarea>";
print "</td>";
print "</tr>";
print "<tr>";
print "<td>\ \;</td>";
print "<td>";
print "<input ******submit value=Gönder!>";
print "</td>";
print "</tr>";
print "</table>";
print "</form>";
Programın içinde geçen "istem" değişkeni program akışını ayarlamak için atanmıştır. Eğer bu değişkenin içi boşsa en sondaki mail formu ekrana yazdırılır yok eğer içeriği "gonder" ise yani form doldurulup gönderilmişse $gonderen $konu ve $mesaj değişkenleri sorgulanır içerikleri boşsa hata verilip program sonlandırılır (exit değilse mail gönderilir ve ekrana karşılama mesajı bastırılır. Bu programı kişisel server'ınızda denerseniz sadece karşılama sayfalarını ve programın içinde hata olup olmadığını görebilirsiniz ancak mail gönderemezsiniz.
ile Dizin İşlemleri :
CGI sunucu tarafında çalışan bir programlama dilidir ve CGI programları sayesinde Perl dilinin kolaylıkları ve avantajlarını kullanarak kendi bilgisayarımızdaymışcasına rahat ve pratik olarak dosya ve dizin işlemleri yapabiliriz. Dosya işlemlerine örnek olarak dizindeki tüm dosyaları okuyup döngü ile ekrana yazdırma klasör oluşturma dosya silme (dosya içeriği değil!) klasör silme verilebilir.
Klasör oluşturma :
Klasör oluşturmak için mkdir() fonksiyonu kullanılır. mkdir() fonksiyonu ile içi boş bir dizin oluşturulur. Kullanımı şu şekildedir :
mkdir ("bosdizin");
Bu kod bize "bosdizin" isminde boş bir dizin oluşturacaktır.
Örnek :
#!/usr/bin/perl
# dizin1.cgi
use CGI qw(tandard);
print "Content-type:text/html\n\n";
$query = new CGI;
$dizinismi = $query -> param('dizinismi');
$istem = $query -> param('istem');
if ($istem eq "olustur") {
if ($dizinismi eq "") {
print "Lütfen geri dönüp dizin ismi bölümünü doldurun";
exit;
}
mkdir("$dizinismi");
print "$dizinismi isimli dizin başarıyla oluşturuldu.";
exit;
}
print "<form action=dizin1.cgi method=get>";
print "<input ******hidden name=istem value=olustur>";
print "Oluşturmak istediğiniz dizin ismi : ";
print "<input ******text name=dizinismi>";
print "<input ******submit value=Oluştur!>";
Dizin silme :
Varolan boş bir dizini silmek için rmdir() fonksiyonu kullanılır. Kullanımı şu şekildedir :
rmdir ("bosdizin");
Bu kod bize mevcut "bosdizin" ismindeki boş dizini silme olanağı verir.
Dosya silme :
Dizin içerisinde herhangi uzantıda bir dosyayı unlink() fonksiyonunu kullanarak silebilirsiniz. Bu fonksiyonla silinen dosyalar kalıcı olarak silinirler yani geri dönüşüm klasörüne gönderilmezler. Tabii windows işletim sistemi için konuşuyorum. Kullanımı şu şekildedir :
unlink ("dosya.txt");
Bu kod "dosya.txt" dosyasının silinmesini sağlar. Daha önce belirttiğim gibi dosya uzantısı önemli değildir dosya.txt yerine dosya.jpg de olabilirdi başka uzantılı bir dosya da.
Dizin okuma :
Perl ile bir dizinde mevcut tüm dosyaları değişkene atayıp ekrana yazdırabiliriz. Bunun için opendir() fonksiyonu kullanılır. opendir() fonksiyonunun 2 tane argümanı vardır; Dosya tutamacı dosya yolu. Kullanımı şu şekildedir :
opendir (DIR "dizin");
Bu kod ile "dizin" isimli klasörü açmış oluruz. Dizin açarken göreceli yol da kullanabiliriz. Mesela az önceki örnekte "dizin" yazan yere sadece bir nokta (.) yazarsak program içinde bulunduğu klasörü iki nokta () yazarsak içinde bulunduğu klasörün bir üst klasörünü gösterir. Sözgelimi program cgi-bin/dizin içerisinde çalışıyorsa opendir (DIR "."); şeklinde bir kullanım ile cgi-bin/dizin klasörü opendir (DIR ""); şeklinde bir kullanımda cgi-bin dizini okunur.
Dizin opendir () fonksiyonu ile açıldıktan sonra readdir(TUTAMAC) şeklinde içeriği isteğinize bağlı olarak kullanılabilir. Buradaki tutamaç opendir () fonksiyonu kullanılırken ilk argüman olarak kullanılan isimdir. Az önceki örnekte DIR yazısıdır. readdir () fonksiyonunu sort() fonksiyonu ile birlikte kullanırsak değişken içeriği alfabetik olarak sıralanır. Şu şekilde :
opendir (DIR ".");
@dizi = sort(readdir(DIR));
Bu kod önce içinde bulunduğu klasörü (.) açar daha sonra alfabetik olarak sıralayıp @dizi isimli dizi değişkenin içeriğine atar. Dizin içeriği açılıp değişkene atandıktan sonra (ya da başka herhangi bir işlem yapıldıktan sonra) closedir(TUTAMAC) şeklinde dizin kapatılır.
opendir (DIR ".");
@dizi = sort(readdir(DIR));
closedir (DIR);
Bu şekilde dizin içindeki her dosyayı dizi değişkenin birer elemanı halinde dizi değişkene atadıktan sonra bu dizi değişkeni kullanarak istediğimizi yapabiliriz. Örnek programda program içinde bulunduğu dizini açacak dizi değişkene atayacak kapatacak ve dizi değişkeni döngü ile ekrana yazdıracak :
#!/usr/bin/perl
# dizin2.cgi
use CGI qw(tandard);
print "Content-type:text/html\n\n";
opendir (DIR ".");
@dizin = sort(readdir(DIR));
closedir (DIR);
print " Dizin içindeki Dosyalar :";
print "<ul>";
foreach $cevir (@dizin) {
print "<li><a href=$cevir>$cevir</a><br>";
}
print "</ul>";
Perl'de modüller ve modül kullanımı :
Modüller daha önceden başkası tarafından ya da bizim tarafımızdan yazılmış programların kullanımını ve bir takım fonksiyonları daha kolay kullanılabilir hale getiren ya da yeni fonksiyonların kullanımını sağlayan perl paketleridir. Modüller genelde *.pm uzantılı olurlar. Genel olarak iki çeşit modül vardır :
Perl'in içinde hazır olan modüller :
Perl programı kurulduğunda içinde bir çok modül paketi hazır olarak gelir. Bu modülleri ve kullanımını windows altında Başlat/programlar/ActiveState Active Perl/Documantation yoluyla öğrenebilirsiniz.
Programcı tarafından yazılan ek modüller :
Bu tip modüller programcı tarafından hazırlanır ve program ile aynı dizine modul_ismi.pm şeklinde kaydedilir. Daha sonra modülün kullanılacağı programın üst satırına (shebang'dan sonra) şu şekilde modülün kullanılacağı belirtilir :
use modul_ismi;
Daha sonra mesela modül içinde sub isim {} şeklinde bir alt program tanımladıysanız isim(); şeklinde modüle atıf yapibilirsiniz.
Birden fazla dosya kullanma (require komutu) :
Bazen program yazarken kodlar o kadar fazla ve karışık olurlar ki kodları bölüp ayrı ayrı dosyalardan çağırmaya ihtiyaç duyabilirsiniz. Perl ile bunu yapabilirsiniz. Bunun için yapmanız gereken tek şey diğer dosyayı çağırmadan yani diğer dosyaya atıf yapmadan önce şöyle bir kod yazmanız :
require "dosya.cgi";
Çağıracağınız dosyanın uzantısı önemli değil. Ayrıca require ile çağırılan dosyanın en altında 1; satırı olmalıdır. Bu çağıran dosyaya "true" değeri yani çağırılan dosyanın okunabildiğini belirtir.
Örnek :
"require" ile çağırılan dosya (require2.cgi) :
#!/usr/bin/perl
# require2.cgi
sub cagir {
print "Bu satırlar require2.cgi içersinde bulunmaktadır.<br>";
print "Perl ile başka bir dosyada bulunan alt programları çağırabilirsiniz<br>";
print "Bu işlem dosya boyutunu ve içeriğini düşürerek işleri kolaylaştırır.";
}
1;
require ile çağıran dosya :
#!/usr/bin/perl
# require1.cgi
require "require2.cgi";
print "Content-Type: text/html\n\n";
print "İki çizgi arasındaki yazılar diğer dosyadan (require2.cgi) çağırılacak :<br>";
print "<hr color=black>";
&cagir;
print "<hr color=black>";
Require fonksiyonu ile başka dosyada bulunan bir alt programı &altprogram; şeklinde çağırabileceğiniz gibi altprogram (); şeklinde de çağırabilirsiniz.
Perl ile cookie'ler :
Cookie'ler web sayfalarında kullanılan programlar tarafından (CGI/Perl PHP ASP JavaScript) bazı işlemleri kolaylaştırmak formları tekrar tekrar doldurma külfetinden kurtulmak ya da bir dahaki ziyarette hatırlamak üzere ziyaretcinin bilgisayarına gönderilen dosyalardır. Hemen hemen her server'da bulunan CGI.pm modülü ile cookie gönderme işlemi çok kolaylaştırılmıştır. Öncelikle CGI.pm modülünün kullanıldığını belirten kodu programın en başına yazmak gerekir
use CGI qw(tandard);
CGI.pm modülü kullanarak cookie göndermek için bir ilişkili dizi (hash) değişken oluşturulur;
$cookie = cookie(-name => "cookie_ismi"
-value => "cookie_degeri"
-path => "cookie_yolu"
-expires => "cookie_zamani");
Örnekte "name" anahtarlı bölüm cookie ismidir. Daha sonra gönderilen cookie'yi okuturken bu isim ile çağırılır. "value" değeri cookie'nin içine yazdırılacak bilgidir. Bu bilgi form vasıtası ile gelen bir değişken olabileceği gibi programın gönderebileceği bir değer de olabilir. Buradaki "path" değeri de programın tam yoludur. Bu bölüm isteğe bağlıdır yani -path ile başlayan satır olmasa da cookie gönderilir ve okunur. "expires" değeri de cookie'nin ne kadar süre geçerli olacağıdır. Bu bölüme gelebilecek değerler şu şekildedir:
Oturumluk :
-expires => ""
"expires" değeri boş bırakılırsa bilgisayara bir oturumluk cookie gönderilir ve browser kapandığında bu cookie silinir.
Günlük :
-expires => "+1d"
"expires" değeri yukarıdaki şekilde düzenlenirse bilgisayara "d" harfinden önce yazılan rakam kadar günlük cookie gönderilir. +5d yazıldığında 5 günlük +15d yazıldığında 15 günlük cookie gönderilir.
Aylık :
-expires => "+1M"
"expires" değeri yukarıdaki şekilde düzenlenirse bilgisayara "M" harfinden önce yazılan rakam değeri kadar aylık cookie gönderilir. +1M bir aylık +5M beş aylık cookie gönderir.
Yıllık :
-expires => "+1y"
"expires" değeri yukarıdaki şekilde düzenlenirse bilgisayara "y" harfinden önce yazılan rakam değeri kadar yıllık cookie gönderilir. Mesela +1y yazdığımızda bir yıllık +10y yazdığımızda 10 yıllık cookie gönderilir.
Cookie Silme :
Eğer daha önceden gönderdiğimiz bir cookie'yi geçersiz hale getirmek istiyorsak aynı cookie ismi ile "expires" değerini "now" olarak girip bu cookie'yi aynen önceki cookie'yi yazdırıyormuş gibi yazdırırız.
-expires => "now"
Dizi değişken oluşturulduktan sonra CGI.pm modülü kullanılarak cookie makinaya gönderilir :
print header(-cookie=>$cookie);
CGI.pm modülü ile daha önce gönderilmiş cookie'yi okumak çok kolaydır :
$isim = cookie("cookie_ismi");
Burada yukardaki hash değişkenin "-name" anahtarına değer olarak verdiğimiz ismi yazdık ve $isim değişkenine atadık. Daha sonra bu değişkeni kullanarak makineye gönderdiğimiz isim değeri ile işlem yapabiliriz.
Toparlamak açısından cookie gönderen bir örnek yapalım. Basit örneğimizde ziyaretci sayfaya geldiğinde ismini sorgulayan bir form olsun ziyaretci ismini yazıp göndersin ve program makinaya cookie göndersin. Eğer ziyarecti daha önce bu formu doldurmuşsa cookie okunsun ve ekrana yazılsın form gösterilmesin :
#!/usr/bin/perl
# cookie.cgi
use CGI qw(tandard);
$query = new CGI;
$isim = $query -> param('isim');
$istem = $query -> param('istem');
$cookie_isim = cookie("ziyaretci_ismi");
if ($istem eq "kukile") {
$cookie = cookie(-name => "ziyaretci_ismi"
-value => "$isim"
-expires => "+1d");
print header(-cookie=>$cookie);
print "Cookie basariyla gonderildi geri donus icin <a href=cookie.cgi>buraya tiklayin</a>";
exit;
}
if ($istem eq "kukisil") {
$cookie = cookie(-name => "ziyaretci_ismi"
-value => "$isim"
-expires => "now");
print header(-cookie=>$cookie);
print "Cookie basariyla silindi geri donus icin <a href=cookie.cgi>buraya tiklayin</a>";
exit;
}
print "Content-Type: text/html\n\n";
if ($cookie_isim eq "") {
print "<form action=cookie.cgi method=post>";
print "<input ******hidden name=istem value=kukile>";
print "Merhaba lütfen isminizi girin : ";
print "<input ******text name=isim>";
print "<input ******submit value=\"Cookie'yi Gönder!\">";
exit;
}
print "Hoşgeldin $cookie_isim ismini içeren cookie 1 gün süreyle
makinanda barınacaktır";
print "denemek için tarihini bir gün ileriye alıp tekrar ziyaret edebilirsin. ";
print "Makinadaki cookie'yi silmek için
<a href=cookie.cgi?istem=kukisil>buraya tıklayabilirsin";
Cookie gönderilmeden önce :
Cookie gönderildikten sonra :
Dikkat !!! Cookie gönderirken cookie'den önce şu kodu :
print "Content-Type: text/html\n\n";
kullanmayın cookie gönderildikten sonra kullanabilirsiniz. Eğer bu kodu cookie gönderilmeden önce (print header(-cookie=>$cookie); kodundan önce) kullanırsanız cookie'nin içerdiği bilgiler direk ekrana yazılır.
Perl'de güvenlik :
CGI programlarında en büyük güvenlik tehtidi SSI kodlarıdır. Eğer ziyaretcilerden form bilgileri varsa ve bu form bilgileri ekrana yazdırılıyorsa form bilgilerindeki SSI komutlarının form bilgilerinin açılması esnasında şu şekilde temizlemeniz gerekir :
$deger =~s/<!--(.|\n)*-->//g;
Eğer bir dosyanın içeriğinde ziyaretcilerin özellikle de kötü niyetli ziyaretcilerinin görmesi sakıncalı olabilecek bilgiler varsa;
Bu dosyayı cgi-bin dizininin içine koyun
Mutlaka uzantısını ".cgi" ya da ".pl" yapın
Eğer Apache web server kullanıyorsanız .htaccess kullanın
Dosyanın bulunduğu dizinde mutlaka boş da olsa bir index.html bulundurun
Eğer dosyadan sadece faydalanıyorsanız (require) dosyanın o dizinde bulunduğuna dair bir belirti link yazı vs. bulundurmayın
Programı internet alanına gönderdikten sonra browser üzerinden programın klasörünün bulunduğu yolu ve dosyanın bulunduğu tam yolu yazıp dosyanın inip inmediğini ya da ekranda görüntülenip görüntülenmediğini defalarca kontrol edin.
Bunun dışında eğer başkası tarafından hazır yazılmış bir program kullanıyorsanız programın dağıtıldığı web sitesini takip edin buglardan ve bu bugların temizlenmesinden kötü niyetli kişilerden önce siz haberdar olun.
.htaccess dosyalası ile dizin içeriğinin korunması :
Eğer kullandığınız web server programı Apache ise dizin içerisindeki dosyaların görüntülenmemesi ve indirilememesi için şu şekilde bir dosyayı notepad vasıtası ile kaydedip dizin içine göndererek güvenliği sağlayabilirsiniz :
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName DenyViaWeb
AuthType Basic
<Limit GET>
order allowdeny
deny from all
</Limit>
Yazılan programların web alanına gönderilmesi :
Kendi yazdığınız ya da başkası tarafından yazılmış hazır programların internet'te sağlıklı olarak çalışabilmesi için FTP programı ile gönderilirken bir takım ayarların yapılması gereklidir.
Dosyaları ASCII olarak gönderin :
Yazdığınız CGI programlarını (*.cgi ya da *.pl) ve bu program içerisinde kullandığınız veritabanı dosyaları (*.txt *.dat.) delenmemiş metin tabanlı yani ASCII dosyalardır. Bunun windows işletim sisteminde çalışan server'larda bir önemi olmasa da Linux işletim sistemi bulunan bir bilgisayarın server'ı için ASCII ve BINARY gönderilen dosyalar farklı şeyler ifade eder. Eğer bir cgi dosyası ASCII olarak değil de BINARY olarak gönderilirse internet alanında Internal Server Error (hata 500) hatası alınır.
Cute FTP ile CGI dosyaları gönderilirken varsayılan ayarlarla çalışılıyorsa herhangi ek ayar yapmanıza gerek yoktur. Cute FTP dosyaları göndrirken ASCII - BINARY ayrımı yapar ve dosyanın türünü anlar ona göre gönderir.
Wise_FTP programını kullanıyorsanız CGI programlarını gönderirken sağdaki büyük pencerenin en altındaki radyo butonlardan "ASCII" butonunun işaretli olduğuna dikkat etmelisiniz. Aynı şekilde eğer resim müzik ya da sıkıştırılmış ZIP dosyası gönderiyorsanız "Binary" seçeneğini işaretlemelisiniz.
Diğer FTP programlarında da dosyaları gönderme esnasında ya da dosyaların gönderileceği server'a bağlanma esnasında yapılacak bir ayar mutlaka vardır.
Chmod ayarı :
Chmod Unıx sistemlerde dosyalara izin hakkı (permissions) vermeye yarayan bir komuttur. Unıx sistemlerde dosyalara 3 tür izin verilebilir.
Bunlar;
okuma (read) yazma (write) çalıştırma (execute) dir. chmod ayarı ile CGI dosyalarımızın ve içindeki şifre gibi bilgilerimizin güvenliğini sağlayabiliriz. CGI dosyaları genelde 755 chmod ile çalışırlar. Bunun anlamı; sahibi için okuma yazma çalıştırma diğerleri için ise okuma ve yazma anlamına gelir. Başka birisi serverınızdaki CGI dosyalarını silemez içeriğini göremez ve değiştiremez. sadece çalıştırabilir. Veri dosyaları genelde CGI dosyalarının form vasıtasıyla gönderdiği bilgileri depolama amacıyla kullanılır. Genelde chmod'ları 644 ya da 666'dır. sadece yazılıp okunma izinleri vardır çalıştırılamazlar.
Cute FTP programı ile dosyayı gönderdikten sonra dosyaya chmod ayarı yapmak için dosyaya sağ tıklayıp "chmod" yazan bölümü tıklayın ve çıkan pencerede dosyaya vermek istediğiniz chmod'u yazın.
Wise FTP ile chmod ayarı yapmak için dosyaya bir kere sol tıklayarak seçili hale getirin sonra sağ tıklayın ve "chmod" yazan yere bir kere tıklayın çıkan pencereye vermek istediğiniz değeri yazın.
Eğer web alanına gönderdiğiniz bir CGI programını browser üzerinden çalıştırmak istediğinizde "Internal Server Error" hatası alıyorsanız şu ihtimalleri gözden geçirin ;
Perl yolu (shebang) yazılmışmı doğru mu?
Dosya ASCII olarak gönderilmiş mi?
Chmod ayarı yapılmış mı Doğru mu?
Dosyanın içinde bulunduğu dizinin CGI/Perl programları çalıştırma izni var mı?
CGI/Perl programcılarının ya da hazır programları kullanan kişilerin dosyaları web alanına upload etmesi esnasında en çok yaptıkları hata bunlardır.
Windows server'larda dosyaları direk klasörden klasöre taşıyabilirsiniz. ASCII - Binary olması farketmez zaten böyle de bir ayar yoktur. Ayrıca chmod ayarı yapmanıza da gerek yoktur.
alıntıdır.