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 okutupbrowser'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 olsundiye 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 websayfasındaki formdan (aşağıda tekrar göreceksiniz) girilen ad,email ve not bilgileri alınıp sistemeyollanı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ırsakistediğ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/perlprint "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 belirledikclose(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.
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/perlprint "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şturuluyorforeach $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.
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 sorgulamaBir ö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.|
|
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 girsenizKelimeyi bozmuş olacağınızdan sorgulama başarısız olur.Örneğin atilla yazıp boşluk tuşuna dadokunursanız kelimeniz atilla+ olacaktır ve dosyam.dat dosyasındaki atilla kelimesineuymayacağı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";