Cgi kullanarak sistemdeki dosyalarla çalisma
Kod:
#!/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://sirius.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://sirius.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://sirius.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";