CGI kullanarak sistemdeki dosyalarla çalışma
 
Örneklerimizde program çıktılarımız Browser'ımızın sayfaları idi. Html veya text sayfası olan bu çıktıları
browser'da görüntülemek yerine sistemdeki bir dosyaya yazmak isteyebilir veya dosyadan okutup
browser'a yazmak isteyebiliriz. Şimdi bu durumlarda ne yapacağımızı görelim.
Bu arada konuya başlarken daha evvel işlenen Dosyalar konusunu gözden geçiriniz. Yine kolaylık olsun
diye aynı form ve örnekten hareket edelim. Önceki formdaki bilgileri bu defa bir dosyaya yazdıralım.
Ayrıca browser'a da Işlem Tamam ! mesajı yollansın.
 
Üzerinde işlem yapacağımız dosyanın adı dosyam.dat ve  onu temsil eden dosya belirteninin adı ise
DOSYAM olsun. Bu dosyayı önce herkesin yazabileceği bir modda açmamız gerekir.
Dosyayı herhangi bir yerde açabiliriz ama biz yine cgi-bin dizininde açalım.
Bu işlemi yapmak için önce;  touch dosyam.dat   (bu komutla dosya oluşturuluyor) komutunu, daha
sonrada chmod 777 dosyam.dat  (bu komutla herkese dosya  üzerinde tüm haklar veriliyor) komutunu
girmemiz gerekir.
 
Şimdi önceki örneğimiz olan ornek2.pl üzerinde değişiklik yapalım. Hatırlarsanız ornek2.pl ile web
sayfasındaki formdan (aşağıda tekrar göreceksiniz) girilen ad,email ve not bilgileri alınıp sisteme
yollanıyor ve bu bilgiler browser web sayfasına yazdırılıyordu. 
Biz sadece bu son kısmı düzeltir ve browser sayfası yerine sistemdeki dosyam.dat a yazdırırsak
istediğimiz gerçekleşecektir. Yazacağımız perl program adı ornek3.pl olsun (tabii bu dosyada cgi-bin
de olacak).   Şimdi kodlayalım.
 
#!/usr/bin/perl
print "Content-type:text/plain\n\n";
 
read(STDIN, $gecici_alan, $ENV{'CONTENT_LENGTH'});
 
@alan_deger_ciftleri = split(/&/, $gecici_alan);
 
foreach $alan_deger (@alan_deger_ciftleri) {
        ($alan, $deger) = split(/=/, $alan_deger);
        $deger =~ tr/+/ /;# + karakteri boşluk karakterine dönüştü
        $deger =~ s/%(..)/pack("C", hex($1))/eg;
# $deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))
        $FORM{$alan} = $deger;
      }
 
{
 
open (DOSYAM, ">>./dosyam.dat") || die ("HATALI iSLEM..!");
print DOSYAM "$FORM{'ad'}:$FORM{'email'}:$FORM{'not'}\n";  
# yukarda bulunan : karakteri her alanı bir diğerinden ayırır.
# bu karakteri, alan ayıracı olarak kendimiz belirledik
close(DOSYAM);
}
        
print "<HTML>\n<HEAD>\n<TITLE>Teşekkürler</TITLE>\n</HEAD>";
print "\n\n<BODY BGCOLOR=\"#FFFFFF\" LINK=\"#CC0000\">\n";
print "<p><br><center><H3>İşlem Tamam !!!</H3><p><br>";
print "<PALIGN=\"CENTER\">\n\n";
print "<FORM>\n";
print "<INPUT onclick=history.go(-1) type=button value=Geri>\n";
print "</FONT></FORM></center><p><br>\n";
print "</center></BODY>\n</HTML>\n";
 

Şimdi aşağıdaki formu dolduralım ve yollayalım.

Form tanımındaki form adı ile ilgili satırın tanımı şöyle olacak:

<form action="http://www.gazi.edu.tr/cgi-bin/ornek3.pl" method="POST">

Sonuçta bilgilerin sistemde bulunan dosyam.dat ' a yazıldığını ve her bir veri alanının da

 birbirinden : karakteri ile ayrıldığını göreceksiniz.

 

Adınız : 
E-mail : 
Notunuz: 


 
 
Dosyalardan Okuma

 

Dosyalara yazma işlemini sanırım anladık.Şimdi sıra sistemdeki dosyadan bilgileri almak(okutmak) ve

bu bilgileri değerlendirmekte... Bir önceki konuda formdan yolladığımız bilgiler dosyam.dat adlı dosyaya

yazmıştı.Şimdi bu dosyadan okutma yaparak hem okuma işlemini hem de bir önceki yazdırma işleminin

doğruluğunu test etmiş olacağız.

Aşağıdaki örnekte dosyam.dat dan okunan satırlar(kayıtlar) sırayla bir browser'ın sayfasına

yazdırılmaktadır.      İnceleyelim.

 

Programın adı ornek4.pl olsun.

 

 #!/usr/bin/perl

 print "Content-type:text/html\n\n";

 {

print "<HTML>\n<HEAD>\n<TITLE>KAYITLAR</TITLE>\n</HEAD>";

print "\n\n<BODY BGCOLOR=\"#FFdd00\" LINK=\"#CC0000\">\n";

open (DOSYAM, "./dosyam.dat") || die ("HATALI iSLEM..!");

print "<p><br><center><H4>Dosyaya girilen kayıtlar aşağıdadır !</H4><p><br>";

print "<PALIGN=\"CENTER\">\n\n";

@tumkayitlar = <DOSYAM>;

close(DOSYAM);

foreach $herbirkayit (@tumkayitlar){

chomp($herbirkayit);

print "$herbirkayit<br>\n";

 }

}

print "<FORM>\n";

print "<INPUT onclick=history.go(-1) type=button value=Geri>\n";

print "</FONT></FORM></center><p><br>\n";

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

 
Şimdi bu programı      çalıştıralım
 
Bir de daha farklı bir çıktısı olan bu programı deneyiniz ve farkı inceleyip anlayınız.
Program kodu aşağıdadır.(ornek5.pl)
 
#!/usr/bin/perl
print "Content-type:text/html\n\n";
 
{
print "<HTML>\n<HEAD>\n<TITLE>KAYITLAR</TITLE>\n</HEAD>";
print "\n\n<BODY BGCOLOR=\"#FFdd00\" LINK=\"#CC0000\">\n";
open (DOSYAM, "./dosyam.dat") || die ("HATALI iSLEM..!");
print "<p><br><center><H4>Dosyaya girilen kayıtlar aşağıdadır
!</H4><p><br>"; 
print "\n\n";
print "<table bgcolor=ffffff border=1 bordercolor=dc6000><tr>"; # Çıktının düzenli olması
                                                                                               #için table tanımları yapılıyor
@adlar = ("AD VE SOYAD","E-MAIL ADRESI","BIRAKILAN NOT"); #çıktı 
                                                                                                  #başlıkları oluşturuluyor
foreach $ad (@adlar)
 {
print "<td bgcolor=ff3300>";
print "$ad";    # başlıklar bastırılıyor
print "</td>";
}
print "<br>\n\n";
print "</tr>";
 
@tumkayitlar = <DOSYAM>;
close(DOSYAM);
 
foreach $kayit (@tumkayitlar){
     chomp($kayit);
     @degerler = split(/:/, $kayit);
     print "<tr>"; # alan içerikleri bastırılıyor
     print "<td>$degerler[0]</td>";
     print "<td>$degerler[1]</td>";
     print "<td>$degerler[2]</td>";
     print "</tr>";
    }  
 
print "</tr></table>\n";
print "<FORM>\n";  
print "<INPUT onclick=history.go(-1) type=button value=Geri>\n";
print "</FONT></FORM></center><p><br>\n";
print "</center></BODY>\n</HTML>\n";
}
 
 

Dosyada String Arama

 

String bildiğiniz gibi içinde her türlü karakterleri barındırabilen karakterler dizisidir(boşluk v.b dahil).

Dosyalara yazma,okuma örneklerimizden sonra şimdi de bir dosyanın içerisinde belli bir string aratma konusunu inceleyelim.Yine konuyu daha iyi kavramak için daha önceki örneklerimize sadık kalacağız.Onceki örneklerde hatırlarsanız dosyam.dat isimli dosya üzerinde çalışmıştık yine aynı dosyada bu sefer string (metin) taraması yapacağız. Dosyada arama yaptırmak için daha önce gördüğümüz konulardan faydalanarak (özellikle patternler)her bir kayıtta örnek stringi tarayacağız.

Bu arada sadece metin aratacağımız için GET metodunu kullanacağız. Şimdi web sayfasında görünümü aşağıdaki gibi olan bir form tanımlayalım.

 

Arayacağınız kelimeyi giriniz :

 

KODU:

 

<table width=60% border=1 bordercolor=#000055 bgcolor=#ff7700> <tr><td>

<form action="http://www.gazi.edu.tr/cgi-bin/ornek6.pl" method="GET">

 Aradığınız kelimeyi giriniz : <input type="Text" name="kelime">

 <input type="submit" value="Ara !">

 <input type="reset" value="Sil">

 </form>

 </td></tr> </table>

 

Yukardaki forma aratacağımız kelimeyi girip Ara ! tuşuna basınca, formun action alanında tanımlandığı üzere ornek6.pl programı çalıştırılacak ve yine o programda adı verilen dosyam.dat dosyasında kelime taranacak ve sonuclar listelenecektir.

Programın kodu ise aşağıdadır.Formu doldurarak çalışmasını görünüz ve aşağıdaki kodu inceleyiniz.

Bu arada taramada kolaylık olsun diye dosyam.dat daki bazı kelimeleri vereyim.

Sevgi kaya(boşluk dahil),Atilla,Sevgi,sev,ali ... Bu kelimeleri sorgulayabilirsiniz.

 

 #!/usr/bin/perl

print "Content-type:text/html\n\n";

$veriler = $ENV{'QUERY_STRING'}; #formdan alan-adı ve içeriği geldi ve aktarıldı

#standart dışı karakterler düşünülerek aşağıdaki 2 satır eklendi

$veriler =~ tr/+/ /;

$veriler =~ s/%(..)/pack("C",hex($1))/eig;

# string normale dönüştü

($alan, $deger) = split(/=/, $veriler);  #alan-adı ve içeriği ayrıştırıldı

$deger =~ tr/a-z/A-Z/;  #buyuk harfe cevrildi..Amac:formdan nasıl girilirse girilsin farketmesin

$deger =~ s/\+/ /g; # + işareti boşluğa dönüştü

 print "<HTML>\n<HEAD>\n<TITLE>TARAMA SONUCLARI</TITLE>\n</HEAD>";

print "\n\n<BODY BGCOLOR=\"#FFdd00\" LINK=\"#CC0000\">\n";

print "Sorgulanan Kelime:$deger<hr nosize>";

print "<center>";

print "<table width=100% bgcolor=33ff00 border=1 bordercolor=ff0000>";

# düzemli çıktı amacıyla web sayfası  tanımlandı

open (DOSYAM, "./dosyam.dat") || die ("HATALI iSLEM..!");

@tumkayitlar = <DOSYAM>; close(DOSYAM);

@adlar = ("AD VE SOYAD","E-MAIL ADRESI","BIRAKILAN NOT");

#sistemdeki dosya açıldı kayıtlar diziye alındı Başlıklar ise bastırılmak uzere bir baska diziye alındı

foreach $ad (@adlar) {

 print "<td bgcolor=ff3300>";

 print "$ad";              # başlıklar bastırıldı

 print "</td>";

}

 print "<br>\n\n";

 print "</tr>";

 foreach $kayit (@tumkayitlar){

 chomp($kayit);  

 $kayit=~ s/\s*##.*$//;

 $kayit =~ tr/a-z/A-Z/;

 # dosyam.dat kayıtları normal olmayan karakterlerden

                               #arındırılıp buyuk harfe cevrildi

        if ($kayit =~/$deger/){  #formdan gelen taranacak kelime kayıttamı? Evet ise aşağıya geç

           @degerler = split(/:/, $kayit); #kaydı alanlarına böl(ad,email,not)

           print "<tr>";

            print "<td>$degerler[0]";

            print "<td>$degerler[1]";

            print "<td>$degerler[2]";

           # kelimenin bulunduğu kayıt (Alanlar ayrı ayrı olmak üzere) bastırıldı

            print "</tr>";

        }

 }

print "</table>";

print "</center></body></html>\n";  #web sayfası sonu

 
Dosyada tam kelime sorgulama
 
Bir önceki örnekte string taraması yapan programı inceledik.Biliyorsunuz şunların her biri string örnekleridir;"ali",ali  ak","0lp96?" v.b.
Bunlar anlamlı yada anlamsız olabilir.Bu defa herhangi bir stringi değil bir kelimeyi, taranan dosyada tam örneği varsa bulan bir program kodlayalım.
 
Formumuz önceki form ile aynı olsun.Sadece program adını ornek6.pl değil ornek7.pl olarak düzelteceğiz.Aşağıdaki formda bu düzenlemeyi yaptım.Kodu ise formun altındadır.
 

 

Aradığınız kelimeyi giriniz :

 
KODU:
 
<table width=60% border=1 bordercolor=#000055 bgcolor=#ff7700>
<tr><td>
<form action="http://www.gazi.edu.tr/cgi-bin/ornek7.pl" method="GET">
Aradığınız kelimeyi giriniz : <input type="Text" name="kelime"> 
<input type="submit" value="Ara !">
<input type="reset" value="Sil">
</form> 
</td></tr>
</table>
 
Yukardaki forma aratacağımız kelimeyi girip Ara ! tuşuna basınca,ornek7.pl programı, dosyam.dat
dosyasında(bir önceki programda  da kullanmıştık) aranan tam kelime örneğini tarar ve sonucu
listeler.Formu doldurarak çalışmasını görünüz ve aşağıdaki kodu inceleyiniz.
Bu arada aranacak kelime tam kelime olmalıdır.Kelimeden sonta yanlışlıkla boşluk dahi girseniz
Kelimeyi bozmuş olacağınızdan sorgulama başarısız olur.Örneğin atilla yazıp boşluk tuşuna da
dokunursanız kelimeniz atilla+ olacaktır ve dosyam.dat dosyasındaki atilla kelimesine
uymayacağından sorgulama başarısız olacaktır.Amacımız tam kelime sorgulaması olduğundan 
bu derece katı önlem aldık.
 
Örnek7.pl
 
#!/usr/bin/perl
 
print "Content-type:text/html\n\n";
 
$veriler = $ENV{'QUERY_STRING'}; #formdan girilen alan-adı ve içeriği
#standart dışı karakterler düşünülerek aşağıdaki satırlar eklendi
$veriler =~ tr/+/ /;
$veriler =~ s/%(..)/pack("C",hex($1))/eig;
 
($alan, $deger) = split(/=/, $veriler);
$deger =~ tr/a-z/A-Z/;
$deger =~ s/\+/ /g;
print "<HTML>\n<HEAD>\n<TITLE>TARAMA SONUCLARI</TITLE>\n</HEAD>";
print "\n\n<BODY BGCOLOR=\"#FFdd00\" LINK=\"#CC0000\">\n";
print "Sorgulanan Kelime:$deger<hr nosize>"; 
if ($deger eq "" or $deger =~ /^\s+/){  #Boş geçilmesin
print "<h1>Sorgulanacak Kelime Girilmedi ..!<h1>";
exit;
}
print "<center>";
print "<table width=100% bgcolor=33ff00 border=1 bordercolor=ff0000>";
open (DOSYAM, "./dosyam.dat") || die ("HATALI iSLEM..!");
@tumkayitlar = <DOSYAM>;
close(DOSYAM);
@adlar = ("AD VE SOYAD","E-MAIL ADRESI","BIRAKILAN NOT");
foreach $ad (@adlar)
 {
print "<td bgcolor=ff3300>";
    print "$ad"; 
print "</td>";
}
print "<br>\n\n";
print "</tr>";
$test=0;
$kontrol=0;
foreach $kayit (@tumkayitlar)
{
        chomp($kayit);
        @degerler = split(/:/, $kayit);   #Dosyadan diziye aktarılıyor sonradan bu diziden bastırılacak
        $kayit=~ s/\s*##.*$//;              #kayıt lüzumsuz karakterlerden ayıklandı
        $kayit =~ tr/a-z/A-Z/;               #kayıt büyük harfe çevrildi
        @kelimeler = split(/[\t ]+/, $kayit);   #tab ve boşluklar varsa kayıt oradan bölündü ve diziye #kondu ve tam kelimeye erişim tedbirleri tamamlandı
        foreach $tam (0..$#kelimeler)  {
            if (@kelimeler[$tam] =~ /\b$deger\b/) #formdan gelen kelimenin tam örneği varmı?
               {
                $test=1;
                $kontrol=1;            
                last;        #gerekli kontrol değişkenleri ayarlandı ve bu döngüden çıkıldı
               }
         }
             if ($kontrol == 1){     # kelime bulundu ve tüm kayıt bastırılıyor
                print "<tr>";
                print "<td>$degerler[0]</td>";   
                print "<td>$degerler[1]</td>";
                print "<td>$degerler[2]</td>";
                print "</tr>";
                $kontrol=0;
                 }
}
             
             if ($test == 0){
                print "<tr>";
                print "<td>Aranan KelimeBulunamadi..</td>";
                print "</tr>";}
                
print "</table>";
print "</center></body></html>\n";