33 - Oku bakiim! Tabi buradaki read() fonksiyonu...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Oku bakiim! Tabi buradaki read() fonksiyonu dikkatinizi ekmi olmal. Neyi okuttuumuzu ve nasl okuttuumuzu ele almadan nce bildiklerimizi bir tazeliyelim: CGI ile bulunduu Web Server ve ona evsahiplii yapan iletim sisteminin ilikilerini gzden geirirken HTTP Servern CGIa iki trl bilgi aktardndan sz etmitik. HTTP Server, Internetten GET yoluyla bilgi alyorsa, bu bilgileri evre deikenlerinden QUERY_STRINGe depoluyor; POST ile alrsa, standard girdi yntemini kullanarak, STDINin iine koyuyordu. Bu arada STDINin yeni boyutu da evre deikenlerinden CONTENT_LENGTHin iine yazlyordu. imdi, QUERY_STRING ile sizin oluturduunuz bir deikenin hi fark yoktur; fakat standard girdi denilen bilgi tutma alan farkldr. Teknik ayrntlarna girmeden belirtebileceimiz balca fark, STDINin ierii deiken gibi ilenmez; dolaysyla nce STDINin ieriini bir deikene aktarmakta yarar var. STDIN, tpk bir dosya gibi okunabilir; dolaysyla iindeki bilgileri aslnda daha sonra sabit diskten dosya okumakta kullanacamz READ fonksiyonuyla okuyabiliriz. Bu fonksiyonun drt argman bulunabilir: 1. Okunacak dosya iin oluturacamz tutamak (Handle) 2. Okunacak eyin iine konaca deiken 3. Okunacak eyin uzunluu 4. Okunacak eyin balad konum, pozisyon Derler ki, Perlde iki ey vardr: Tekil/Scalar deiken ve dosya tutama! Dier herey bu iki geden trer! Dosya ama, okuma yazma bahsine ve dolaysyla tutaman nemine daha sonra dneceiz; imdilik sadece unu bilmek yeterlidir: Perln aaca dosya iin dosya adndan baka deiken adna ihtiyac vardr ve buna tutamak (Handle) denir. Bunu, Perln bir dosyaya kendi iinde verdii zel bir isim olarak bakabilirsiniz. Standard girdiler ise Perl (dier btn Unix programlama dilleri) iin alm dosya demektir; alm ve bir tutamak verilmi zel bir dosya tr. Tutaman ad STDINdir ve bizim sabit diskte bulunan ve okumak-yazmak iin aacamz bir dz yaz dosyas gibi ilem grr. Bu zel dosya iindekileri de okurken, bir deikenin iine okumak gerekir; read fonksiyonunun ikinci argman bunu salar. Perle okuyaca eyin boyutunu, uzunlugunu sylemeniz gerekir; bu nc argman olarak yazlr. Drdnc ve verilmesi zorunlu olmayan argman ise okumaya balanacak bytedr. read fonksiyonu sabit diskteki binary dosyalar okumakta kullanld ve bu dosyalarn ierii sabit diskte byte lsyle yazld iin, konumu byte olarak belirtiriz. Dosyalarmz genellikle batan okuttuumuz iin bu argman genellikle 0 olur. read fonksiyonunun ileyebilmesi iin okuduu eyi iine yazaca bir tekil/Scalar deiken gstermemiz gerekir. Neden tekil/Scalar deiken de dizi deil? nk STDINin iindeki herey, Formdan gelen bir Stringdir. Browsern Form verilerini yumak yapp gnderdiini hatrlyor musunuz? Burada $depo adn verdii deiken, okunan STDIN deerlerini tutacaktr. Dosya okuma konusunda daha renebileceimiz ok ey var; STDINi okumak iin bu kadar bilgi yeter; fakat unu belirtmek gerekir: Okumaya altmz dosyann boyutunu tam olarak belirtmezsek, Perl bilgileri eksik alabilir veya dosyann bittii yeri geer ve dosyaya ait olmayan eyleri de okuyabilir. Dolaysyla STDINin ierdii hereyi okutabilmek iin okutacamz eyin uzunluunu evre deikenlerinden CONTENT_LENGTHden reniyoruz. evre deikenleri Perl tarafndan %ENV adl zel bir likili Dizinin iinde tutulur ve bu dizideki CONTENT_LENGTH anahtarnn deerini $ENV{'CONTENT_LENGTH'} deyimi ile renebiliriz. Peki, read (STDIN, $depo, $ENV{'CONTENT_LENGTH'}); deyimini irdelediimize gre, imdi programmzn dier blmlerine bakabiliriz. Kodumuzun i yapan blmndeki dier deyim yle: @girdiler = split(/&/, $depo); split ilevini tanyoruz: bir deikenin ieriini alyor ve verdiimiz blme noktas karakterinden blmlere ayryor. Burada $depo deikenin ierdii Stringi (ve anlamna gelen) ampersand (&) iaretinden bldryoruz; elde edilecek bamsz Stringleri @girdiler dizi-deikenine (Array) yazdryoruz. Browsern Form verisini nasl yumak yaptn hatrlyor musunuz? (pucu: isim=Mustafa+Durcan&yas=23) Browser, Formdaki her bir alann ad eittir (=) iaretiyle Formu tasarlayan veya dolduran kiinin verdii deerle birletirip, sonra bunlar ampersand (&) iaretiyle birbirine balyordu. Hatrlarsanz, bu arada boluklarn yerine art (+) iareti konuyor; ayrca zel karakterlerin yerine de Heksadesimal deerleri yazlyordu. $depo deikeni iindeki String, & iaretinden blmlere ayrlrsa, elimizde ne kalr? unun gibi bir ey: @girdiler[0]...adi=Mustafa+Durcan @girdiler[1]...Adres=Web+Teknikleri%2C+Istanbul @girdiler[2]...Gonder=G%F6nder @girdiler[3]...Kod=34000 @girdiler[4]...Merak=Siir @girdiler[5]...eposta= mdurcan@webteknikleri.com @girdiler[6]...mesaj=Mutluluklar+dileriz @girdiler[7]...yuksek=ON Burada boluklarn yerine art (+) iareti konduuna ve mesela virgln yerine heksadesimal deeri olan %2C, harfi yerine %F6 yazldna dikkat edin. ...
View Full Document

Ask a homework question - tutors are online