İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

DOSYA İŞLEMLERİ

Dosya Açma:

Biçimi :

open (dosyadeğişkeni, dosyaadı);

dosyadeğişkeni : Dosyanın basvuracağı, kullanmak istediğiniz isim.Herhangi bir harf,rakam ve _ karakterlerinden oluşur. İlk karakter harf olmalıdır.Aşağıdakiler geçerli adlardır.

MY_NAME

NAME2

A_REALLY_LONG_FILE_VARIABLE_NAME

Aşağıdakiler ise geçerli değildir.

1NAME

A.FILE.NAME

_ANOTHERNAME

if

dosyaadı : Açılacak dosyanın makine içindeki yeri ve adı Örnek:

open(FILE1, "file1");

burada işlem yapılacak dosya file1 dir. Ona başvuruyu temsil eden isim ise FILE1 dir. Perl file1' açacağını anlar ve onu FILE1 ile birleştirir. programda FILE1 adı kullanıldığında file1' i temsil eder. Eğer değişik bir dizindeki file kullanılacaksa yolu tam verilmelidir.

open(FILE1, "/home/ertan/rehber.dat");

gibi...

Dosya Açılma biçimleri:

Dosya kullanım amacına göre 3 şekilde açılır.

1.Okuma için açma modu : Var olan bir dosya okuma amaçlı açılır.

Ör : open(READFILE, "/home/ertan/rehber.dat");

2.Yazma için açma modu ( > ) : Mevcut olmayan,ilk defa oluşturulacak dosyalar bu mod ile açılır. Eğer mevcut bir dosya bu modda açılırsa içeriği tamamen silinir ve yeniden oluşur.

open (OUTFILE, ">/home/ertan/rehber.dat");

3.Ekleme için açma modu ( >> ) : Var olan bir dosya yazma(var olan kayıtlara ekleme) amacıyla açılır.

open (APPENDFILE, ">>/home/ertan/rehber.dat");

Önemli Notlar:

Dosya Açma işleminin doğruluk kontrolü:

Bu işlem için if, unless gibi deyim ve fonk.lar kullanılırak kontrol yapılır. Eğer hata varsa dönen değer 0 dır.Hata yoksa 0 olmayan eğer döner. Dosya test operatörlerini daha sonra işleyeceğiz. Örnek :

if (open(DOSYAM, "/home/ertan/dosya")) {

            # file başarı ile açıldığında if bloğu içi

            # olan bu kısım işlenir

    }

# dosya açılmamışsa burası işlenir.

Dosyadan okuma biçimi :

Dosyayı temsil eden ad <> karakterleri içersinde gösterilir.

$kayit = <DOSYAM>;

gibi..

Bu komutla DOSYAM ile temsil edilen dosyadan bir kayıt(satır) okunur ve $kayit skalar değişkenine atanır.

ÖRNEK PROGRAM :Dosyadan kayıt okuyup ekrana basan program Adı dosya1.pl olsun.Kullanacağımız dosyanın adı bilgi.dat ve içeriğinin de, Bu ilk kayıttır. İkinci kayıt. Dosyadaki son kayıt. şeklinde olduğunu varsayalım.

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl

  if (open(DOSYAM, "bilgi.dat")) {

          $kayit = <DOSYAM>;

          while ($kayit ne "") {

                  print ($kayit);

                  $kayit =<DOSYAM>;

          }

  }

Çalışması :

>dosya1.pl

   Bu ilk kayıttır.

   İkinci kayıt.

   Dosyadaki son kayıt.

>

die() FONKSİYONU ile PROGRAM SONLANDIRMA İŞLEMİ:

Herhangi bir durumda programdan çıkış işlemi yapılacaksa die() fonksiyonunu kullanabiliriz. Bu fonksiyonun yazım formatı: die (mesaj); şeklindedir. Ör:

die ("Program işleyişi durdu!\n"); 

komutu kullanılmışsa program aşağıdaki mesajla kesilir.

  Program işleyişi durdu!

Şimdi Örnek bir programda bunu kullanalım program adı dosya2.pl programda yine bilgi.dat dosyası ile işlem yapalım...

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl

  unless (open(DOSYAM, "bilgi.dat")) {

          die ("bilgi.dat dosyası açılamadı!!!\n");

  }

# yukardaki unless bloğu yerine şu şekilde de kodlama yapabilirdik.

#

#open (DOSYAM, "bilgi.dat") || die ("bilgi.dat dosyası açılamadı!!!");

#

#

 # Program akışı bu satıra geldiyse dosya açıldı demektir

   $kayit = <DOSYAM>;

  while ($kayit ne "") {

         print ($kayit);

         $kayit = <DOSYAM>;

 }

Çalışması:

>dosya2.pl

   Bu ilk kayıttır.

   İkinci kayıt.

   Dosyadaki son kayıt.

>

Eğer bilgi.dat dosyası yok veya bozuk olsaydı o zaman die ile başlayan satırları içeren blok devreye girer ve programın işleyişi,bilgi.dat dosyası açılamadı!!! mesajı ile kesilirdi.

programda unless () fonksiyonu kullanıldığını da gördünüz. Ne işe yaradığını programı dikkatle incelerseniz anlayacaksınız.die fonksiyonu ile hangi satırda hata verdiğini de yazdırabiliriz. Sondaki \n karakterini kaldırmamız gerekir. Örnekleri inceleyerek kullanım farkı sonuçlarını anlayalım.

die ("Dosya bulunamadı\n");

Çıktısı : Dosya bulunamadı

die ("Dosya bulunamadı");

Çıktısı : Dosya bulunamadı at dosya2 line 14.

dosya2 programın adıdır.(program adı dosya2.pl ise).

DOSYADAN dizilere OKUMA:

Genel formatı: @array = <DOSYAM>; şeklindedir. Bunu örnek programda inceleyelim. Dosyanın tamamı bir diziye okunacak ve ekrana basılacaktır. Program adı dosya4.pl olsun ve bilgi.dat kullanılsın.

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl

  unless (open(DOSYAM, "bilgi.dat")) {

          die ("bilgi.dat dosyası açılamadı!!!\n");

  }

  @okuyandizi = <DOSYAM>;

 #Bir üst satırda dosyanın tamamı dizi elemanları olarak diziye alınır

#dizi listesi görünümü şu şekildedir

 #("Bu ilk kayıttır.\n"         ....>burası $okuyandizi[0],yani dizinin ilk elemanı

#  "İkinci kayıt.\n"           ....>burası $okuyandizi[1],yani dizinin ikinci elemanı

#  "Dosyadaki son kayıt.\n")   ....>burası $okuyandizi[2],yani dizinin üçüncü elemanı

# aşağıda ise ekrana basılır.

 print (@okuyandizi);

Çalışması :

>dosya4.pl

   Bu ilk kayıttır.

   İkinci kayıt.

   Dosyadaki son kayıt.

>

DOSYALARA YAZMA İŞLEMİ :

Dosya yazma amaçlı (yazma ve ekleme) açılır. Sonrada yazdırma komutu uygulanır. Örneğin;

open(DOSYAM, ">bilgi.dat");

ile açılır

print DOSYAM ("Bu ilk kayıttır.\n");

komutuylada satır yazılır. Yukarda ki kodlama sonucu bilgi.dat içeriği şöyledir ;

Bu ilk kayıttır

Bir örnek program yapalım. Program adı dosya5.pl olsun. İki dosya kullanalım veren.dat ve bilgi.dat. veren.dat'tan okutup bilgi.dat'a yazılsın. veren.dat dosyası içeriği şöyle olsun;

Bu ilk kayıttır.

İkinci kayıt.

Dosyadaki son kayıt.

Göster Gizle Kopar Satır Gizle Satır Göster

#!/usr/local/bin/perl

unless (open(VEREN, "veren.dat")) {

          die ("veren.dat dosyası açılamadı!!!\n");
}

unless (open(DOSYAM, ">bilgi.dat")) {

          die ("bilgi.dat dosyası açılamadı!!!\n");

}

$kayit = <VEREN>;  # veren.dat'tan bir satır,$kayit değişkenine aktarılır.

while ($kayit ne "") {    # veren.dat kayıtları bitti mi? Bittiyse blok dışına çık.

  print DOSYAM ($kayit);  # $kayit değişkeninde ki satır bilgi.dat'a yazdırılır.

  $kayit = <VEREN>;  # veren.dat'tan bir satır,$kayit değişkenine aktarılır.

}

print("Aktarma işlemi tamamlandı !!!");  # tırnak içindeki mesaj ekrana yazdırılır.

Çalışması:

>dosya5.pl


Aktarma işlemi tamamlandı !!!

veren.dat dosyasının içeriği aynen bilgi.dat dosyasına aktarılır ve sonuçta her iki dosya içeriği de aşağıdaki görünümde olup aynıdır.

Bu ilk kayıttır.

İkinci kayıt.

Dosyadaki son kayıt.

STANDART ÇIKTI DOSYASI:

Standart çıktı dosyası tıpkı standart girdi dosyası gibi sistem fonksiyonudur. Standart girdi(<STDIN>;) klavyeden girişi temsil ediyordu. Standart çıktı aygıtı ise ekrandır. Standart çıktı aygıtına yazdırma işlevini <STDOUT>; komutu görür. Şu iki satırın işlevi aynıdır.

print ("Here is a line of output.\n");

print STDOUT ("Here is a line of output.\n");

dolayısıyla print STDOUT... kullanımına gerek yoktur. Perl bu işi otomatikman yapar.

DOSYA BİRLEŞTİRME :(merge)

İki dosyadan okuttuğumuz satırlardan yeni bir dosya oluşturma: Bir çok değişik mantıkla yapılabilir. Mesela iki dosyadan okutulan satırları standart output (ekran) dosyasına yazan bir program. program adı dosya6.pl, okutulacak dosyalar dosya1 ve dosya2 olsun

dosya1 kayıtları:                      dosya2 kayıtları

a1                                                    b1

a2                                                    b2

a3                                                    b3

ekrana (standart çıktı dosyasına) şu şekilde yazsın istiyoruz varsayalım,

                                             a1           

                                              b1

                                              a2
	
                                              b2

                                              a3

                                              b3

Çalışması:

>dosya6.pl


    a1


    b1


    a2


    b2


    a3


    b3

Dosya giriş çıkış fonksiyonları

Temel giriş çıkış fonksiyonları open, close, print, printf, write fonksiyonlarıdır. Bunları görmüştük . Hatırlayalım ve biraz daha inceleyelim.

Open Fonksiyonu : Dosya erişimi sağlar.

open (DOSYAM, "/u/ertan/dosya.txt"); 

open, default olarak okuma amaçlı dosya açar.İlk defa açılan dosyaya yazmak için > kullanılır.

open (DOSYAM, ">/u/ertan/dosya.txt"); 

Mevcut dosyaya eklemek için ise >> kullanılır;

open (DOSYAM, ">>/u/ertan/dosya.txt"); 

Ayrıca

open (MAIL, "|mail ertan"); 

şeklinde pipe ile kullanımını da görmüştük.

open fonksiyonu bunlardan başka daha birkaç çeşit dosya açma biçimi kullanır. Aşağıdaki kullanım bunlardan birisidir.

open (CAT, "cat dosya*|");

burada open, unix'teki cat dosya* komutunu icra eder. | işareti dosya adından sonra yazılır. Buradaki komutla adı dosya ile başlayan tüm dosya isimleri bir dosyaya listelenir. Bu dosya bir giriş dosyası gibidir ve CAT dosya değişkeni kullanılarak erişilebilir. Örnek : pipe'lı komutla unix'teki w komutu çıktısını giriş olarak alma

w komutu çıktısını aşağıda görüyorsunuz.Programı ona göre inceleyiniz.

ertan> w 

11:09am  up 30 days,  2:31,  3 users,  load average: 0.06, 0.07, 0.01 

USER      TTY      FROM                   LOGIN@    IDLE     JCPU   PCPU   WHAT 

ftpadmin  ttyp3    darkness.anadolu  Wed 1pm  12:22m  0.12s  0.12s   -bash 

poyraz     ttyp4    192.168.100.59      8:56am    0.00s     0.58s  0.07s   pine 

ertan       ttyp0    192.168.100.9       9:52am    0.00s      0.29s  0.02s   w 

Göster Gizle Kopar Satır Gizle Satır Göster

1:  #!/usr/local/bin/perl 

2:  # w çıktısından saat ve o an için bağlı olan kullanıcıları alalım 

3:  open (WOUT, "w|");     # w komutu çıktısı WOUT tarafından alınır 

4:  $saat = <WOUT>;        # WOUT ' un ilk satırını okur(yani aşağıdaki satır) 

                                      #(11:09am  up 30 days,  2:31,  3 users,  load average: 0.06, 0.07, 0.01) 

5:  $saat =~ s/^ *//;       #baştaki boşlukları çıkarır 

6:  $saat =~ s/ .*//;       # ilk kelimeden sonraki her şeyi çıkartır(sondaki newline hariç). 

                            #Kısaca 5. ve  6. satırlar saat'i(11:09am) elde eder. 

$saat =~ s/pm|am$//;          #Not: sondaki -am- veya -pm- gösterimini kaldırmak istersek bu satırı ekleriz. 
7:  <WOUT>;  

        #WOUT dan ikinci satırı okur bu satır bizim için gereksizdir. Aşağıdaki Başlık satırını atlat(geç) işlevi gerçekleşir. 
        #[USER   TTY   FROM     LOGIN@   IDLE   JCPU   PCPU   WHAT] 

8:  @kullanicilar = <WOUT>;   #kalan satırlar @kullanicilar dizisine okunur. 

9:  close (WOUT);  #WOUT dosyasıyla işimiz bitti.Sistem kaynaklarını tüketmemek için kapattık. 

10: foreach $kullanicilar  (@kullanicilar) {#@kullanicilar'ın her bir elemanı, kullanıcı bilgisinin 1 satırını içerir. 
11: $kullanicilar =~ s/ .*//; # programımız, bu satırın ilk kelimesine(kullanıcı adı) ihtiyaç duyar# .Bu yüzden 10,11 ve 
12: }              #12 satırlarda döngü tamamlanınca newline hariç her şey temizlenir dizide sadece kullanıcı listesi bulunur. 
13: print ("Saat:  $saat "); 

14: print ("Halen bagli olan  kullanicilar:\n"); 

15: $oncekikullanici = ""; 

16: foreach $kullanici (sort @kullanicilar) {  #kullanıcılar alfabetik sıralanıyor 

17:   if ($kullanici ne $oncekikullanici) ##Birden fazla aynı kullanici bağlantısı varsa, $oncekikullanici son basılan 
    #kullanici adını tutar. Ve $kullanici içindeki değer, $oncekikullanici ile aynı ise basılmaz 
18:      print ("\t$kullanici");      # ve uygun ise basılır 

19:     $oncekikullanici = $kullanici; 

20:         } 

21: }

çalışması;

ertan> ./program.pl  

        Saat:  11:24 

        Halen bagli olan  kullanicilar: 

             ertan 

             ftpadmin 

             poyraz

DOSYADAN DOSYAYA YÖNLENDİRME

Unix' te standart error ve standart çıktıyı aynı dosyaya yönlendirir. sh komutu olarak şöyle yazılır.

$ program >dosya1 2>&1 

Aşağıdaki program standart çıktı ve standart error dosyalarının yönlendirilişiyle ilgili bir örnektir. Örnek :

Göster Gizle Kopar Satır Gizle Satır Göster

çalışması; programın ekrana çıktısı yoktur.Çıktı Yazdir isimli dosyayadır. Yazdir isimli çıktı dosyasının içeriği şöyledir.

          Satir 2 

          Satir 1  

Sıralı yazmadığını gördük çünkü işletim sisteminin özelliğinden dolayı değerler buffer' dadır ve buradan önce STDERR ' e yazar. Bu problemi çözmek istersek dosya için buffer' ı kullanmama işlemi yapılır. Önce select ile dosya seçilir. Sonra $| sistem değişkenine 1 atanır. Eğer $| değişkenine 0 olmayan değer atanırsa buffer kullanılmaz. Tıpkı $~ ve $^ gibi $| da son kullanılan dosyaya etkilidir ki o dosya select ile son seçilendir. Eğer select kullanılmamışsa STDOUT'dur.

Şimdi $| kullanarak önceki örnekten farklı olarak sırayla yazan programı görelim. Örnek :

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl 

open (STDOUT, ">Yazdir") || die ("STDOUT dosya acma hatasi"); 

open (STDERR, ">&STDOUT") || die ("STDERR dosya acma hatasi"); 

select (STDOUT); 

$| = 1; #buffer'ı kapat.Seçilen dosya yazdırma kanalını aç,seçilen dosya  bir önceki satırda belirlendi:STDOUT. 

                # Not: Aslında STDOUT default dosya olduğundan onu select ile seçmeye gerek yoktu sadece $| = 1; yeterliydi. 

print STDOUT ("Satir 1\n"); 

print STDERR ("Satir 2\n"); 

close (STDOUT); 

close (STDERR);

Yazdir dosyası içeriği aşağıdaki gibidir.

Satir 1 

Satir 2 

OKUMA VE YAZMA ERİŞİMİ TANIMLAMA

Okuma ve yazma erişimi ile dosyayı açmak için dosya adından önce +> kodlanır.

open (OKUYAZ, "+>dosya.dat"); 

bu erişimle dosyanın bir kısmının üzerine yazma hakkı almış olursunuz. Bu tip kullanımlarda en verimli çalışma seek ve tell fonksiyonlari ile birlikte gerçekleştirilir. Bunlar dosyada karakter(ler) atlama işlevi sağlar. İlerde inceleyeceğiz.

ayrıca +< eki' de okuma ve yazma amaçlı tanımda kullanılabilirler.

open (OKUYAZ, "+<dosya.dat"); 

< eki okuma amaçlı tanımdır bu demektir ki aşağıdaki iki örnek aynıdır.

open (OKU, "<dosya.dat"); 
open (OKU, "dosya.dat"); 

close Fonksiyonu : dosya kapatır. Eğer | ile komut şeklinde kullanıldıysa (open (DOSYA, "cat dosya*|"); ) gibi O takdirde komut bitene kadar program bekler. print, printf, write Fonksiyonu : Bunları görmüştük.

select Fonksiyonu : Bir dosyayı default yapmak için kullanılır. Bunu da görmüştük.

eof Fonksiyonu : Dosya sonunu kontrol eder. Okunacak kayıt kalmamışsa 0 olmayan değer döndürür. Eğer okunacak kayıt varsa 0 döndürür. <> işaretlerinden etkilenir. eof and eof() farklıdır. eof nin <> işaretlerden nasıl etkilendiği görülür. Aşağıdaki örnekte bu durumu gözleyebiliriz. Örnek programda komut satırından isimleri verilen dosyalar(1 veya daha çok)'ın içeriği basılır. dosya1 içeriği şöyle olsun;

Bu ilk dosyanın ilk satırı 

Bu ilk dosyanın ikinci satırı 

Dosya2 içeriği ise ;

Bu ikinci dosyanın ilk satırı 

Bu ikinci dosyanın ikinci satırı 

Örnek : eof ve <> birlikte kullanımı;

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl 

while ($kayit = <>) {#<>operatörü der ki; adları komut satırında verilen dosyalardan ,okunmakta olanın sıradaki satırını oku 

    print ($kayit);    # ve yazdır. 

    if (eof) {           #dosya sonu geldiyse aşağıdaki mesaji bas 

              print ("-- Kullanımdaki dosyanın Sonu --\n");                 

             } 
  }

çalışması; ./program.pl  dosya1  dosya2 
Bu ilk dosyanın ilk satırı 

Bu ilk dosyanın ikinci satırı 

-- Kullanımdaki dosyanın Sonu -- 

Bu ikinci dosyanın ilk satırı 

Bu ikinci dosyanın ikinci satırı 

-- Kullanımdaki dosyanın Sonu -- 

dosya sonu kontrolünde eof ve eof() kullanılır ama ikisi birlikte kullanılmaz.

Şimdi de parantezli eof kullanımına bakalım.Örnek :

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl 

while ($kayit = <>) { 

    print ($kayit); 

    if (eof()) { 

              print ("-- Kullanımdaki dosyanın Sonu --\n"); 

             } 

 }

çalışması ;

./program.pl  dosya1  dosya2 

Bu ilk dosyanın ilk satırı 

Bu ilk dosyanın ikinci satırı 

Bu ikinci dosyanın ilk satırı 

Bu ikinci dosyanın ikinci satırı 

-- Kullanımdaki dosyanın Sonu -- 

Çıktıyı incelediğinizde dosya sonu mesajının her dosyanın sonunda değil tüm dosyaların okunması Sonunda bir defa yazdığını görüyorsunuz. eof() kullanımında ancak tüm dosyalar bitince true döner. Birinci dosya sonunda kontrolde false 'e döner. Çünkü sırada okunacak ikinci dosya vardır. Yalnız şuna dikkat etmemiz gerekir eof ile eof() arasında sadece <> operatörüyle kullanımda fark vardır. Yalnız başlarına kullanımda eof ile eof() arasında fark yoktur.

DOSYA İSİMLERİNİN DOLAYLI KULLANIMI

$dosya = "DOSYAM"; 

open ($dosya, ">dosya.dat");     gibi... 

Örnek :

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl 

&dosya_ac("OKU", "", "dosya1"); 

&dosya_ac ("YAZ", ">", "dosya2"); 

while ($satir = &dosyadan_oku("OKU")) { 

         &dosyaya_yaz("YAZ", $satir); 

      } 

sub dosya_ac { 

local ($dosya_degiskeni, $dosya_modu, $dosya_adi) = @_; 

open ($dosya_degiskeni, $dosya_modu . $dosya_adi) || 

die ("$dosya_adi  dosyası açılamadı... "); 

} 

sub dosyadan_oku { 

local ($dosya_degiskeni) = @_; 

<$dosya_degiskeni>; 

} 

sub dosyaya_yaz { 

local ($dosya_degiskeni, $satir) = @_; 

print $dosya_degiskeni($satir); 

}

çalışması, program ekrana çıktı vermez. dosya1 adlı dosyayı dosya2 ye kopyalar. more dosya1 veya cat dosya1 gibi komutlarla baktığımızda her iki dosyanın da içerik olarak aynı olduğunu görürüz.

$  cat dosya1 

Bu ilk dosyanın ilk satırı 

Bu ilk dosyanın ikinci satırı 

$  cat dosya2 

Bu ilk dosyanın ilk satırı 

Bu ilk dosyanın ikinci satırı 

DATALARI ATLAMA VE YENİDEN OKUMA

== seek == == tell ==

Şimdiye kadar hep ilk sıradan başlatarak okuma örnekleri gördük. Perl bize iki hazır fonksiyon sunar.Bunlar seek ve tell fonksiyonlarıdır. Bu fonksiyonlar dosyada ileri, geri hareketi veya tekrar okuma gibi işlevlere sahiplerdir.

seek fonksiyonu : bu fonksiyon dosya içinde ileri ve geri hareketi sağlar. Formatı ;

seek (dosyadeğişkeni, atlanacak karakter sayısı, konum_sabiti);

eğer konum sabiti;

0 ise; dosya başı 

1 ise; bulunulan konum değeri 

2 ise; dosya sonu anlamı taşırlar. 

Örneğin; DOSYAM adlı dosyanın başına atlamak istiyorsak

seek (DOSYAM, 0, 0);

kodlanır. Aşağıdaki ifade bulunulan karakter pozisyonundan 80 byte (karakter) ileri atlar.

seek (DOSYAM, 80, 1); 

aşağıdaki ifade ise 80 karakter geri gider.

seek (DOSYAM, - 80, 1); 

dosya sonuna atlamak için ise;

seek (DOSYAM, 0, 2); 

seek başarılı olursa true(0 olamayan değer) aksi takdirde false(0) döndürür. seek ,tell fonksiyonu ile çok sık kullanılır.

tell Fonksiyonu : Mesafe döndürür.

Bu mesafe dosya başı ile bulunulan pozisyon(bir sonra okunacak satır bölgesi) arası mesafedir.Birimi byte' dır. Formatı;

tell (dosya_değişkeni); 

o an kullanılacak olan dosyanın adını saklayan değişken örneğin DOSYAM ' ın kullanım anındaki pozisyonunu elde eden kodlama şu şekilde yazılır.

$pozisyon = tell (DOSYAM);

seek ve tell kullanımı örneği içeren bir program yazalım. Çalışacağımız dosyanın adı dosya1 ve içindeki kayıtlar şöyle olsun;

Ertan TURKMEN ANKARA TURKIYE 

JOE ROSE NEWYORK USA 

ŞAZİYE MORAL ISTANBUL TURKIYE 

DANIYAR ANDICAN TASKENT OZBEKISTAN 

Örnek:

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl 

open (GECICI_DOSYA, "dosya1"); 

print "Dosya yazdırılıyor ..!\n\n"; 

print "DOSYANIN ILK KAYDI--"; 

while (1) { 

  $satir = <GECICI_DOSYA>; 
  
  last if ($satir eq ""); 

  print ($satir); 

  if (eof()) { 

    print "DOSYA SONU\n"; 

   last; 

} 

   $pozisyon = tell(GECICI_DOSYA); 

   $pozisyon++; 

   print "--Yeni SATIR--Dosyada $pozisyon.karakterdeyiz\n"; 

   print "5 karakter sonrası: "; 

   seek (GECICI_DOSYA, 5, 1); 

}

çalışması: program.pl

Dosya yazdırılıyor ..! 

DOSYANIN ILK KAYDI--Ertan TURKMEN ANKARA TURKIYE 

--Yeni SATIR--Dosyada 30.karakterdeyiz 

5 karakter sonrası: OSE NEWYORK USA 

--Yeni SATIR--Dosyada 51.karakterdeyiz 

5 karakter sonrası: E MORAL ISTANBUL TURKIYE 

--Yeni SATIR--Dosyada 81.karakterdeyiz 

5 karakter sonrası: AR ANDICAN TASKENT OZBEKISTAN 

DOSYA SONU 

dosya değişkeni pipe (|)' a refere ediyorsa tell ve seek kullanılamaz. Örneğin;

open (DOSYAM, "cat dosya*|"); olursa aşağıdaki satır anlamsızdır 

$satir = tell (DOSYAM) 

SİSTEM OKUMA YAZMA FONKSİYONLARI

Perl' de <DOSYADEGISKENI>şeklindeki ifade dosyadan en temel okuma şeklidir. Bunun dışında dosyadan okuma için iki fonksiyon daha vardır. Bunlar;

Perl yazmak için de fonksiyonlar sunar. Örneğin unix' de ki write' a benzeyen syswrite fonksiyonu gibi.read Fonksiyonu: okuma yapar ve isteğe bağlı karakter sayısını skalar değişkene atar.

read (dosyadegiskeni, sonucdegiskeni, uzunluk, atlamadegeri); 

okunacak skalar veya okunacak dosya' ı temsil array değişken karakter sayısı eder.(okunan buraya depolanır) Örn:

read (DOSYAM, $skalar, 80); 

bu çağrı ile DOSYAM' dan 80 karakter(byte) okunur ve $skalar değişkenine depolanır. Eğer DOSYAM dosyasının sonuna gelinirse 0' a döndürür, normalde okunan karakter(byte)leri döndürür. Eğer hata oluşursa read, null string döndürür. read kullanılarak skalar değişkene bir argüman eklenebilir. Bu argüman değişken içinde atlanacak byte sayısını verir. Örn:

read (DOSYAM, $skalar, 40, 80);

komutu ile read, DOSYAM' dan bir başka 40 byte okur ve bunu $skalar 'a kopyalarken daha önce depolanmış 80 byte'ı atlar.

sysread Fonksiyonu : Mümkün olduğunca hızlı data okumak için read yerine sysread kullanabilirsiniz.

Formatı;   sysread (dosyadegiskeni, sonucdegiskeni, uzunluk, atlamadegeri( isteğe bağlı )); 

Örn:

sysread (DOSYAM, $skalar, 80); 

sysread (DOSYAM, $skalar, 40, 80);      read ile kullanımı aynıdır. 

sysread UNIX' in read komutu ile aynıdır.

syswrite Fonksiyonu : Bu fonksiyonda olabildiğince hızlı yazmak için kullanılır. UNIX' deki write komutuyla aynıdır. Formatı:

(dosyadegiskeni, sonucdegiskeni, uzunluk, atlamadegeri); 
syswrite (dosyadegiskeni, data, uzunluk, atlamadegeri); 

yazılacak datanın byte atlama dosyayı temsil nerede olarak değeri eder. olduğu uzunluk ( isteğe bağlı )

Örnek:

syswrite (DOSYAM, $skalar, 80); 

$skalar' ın 80 byte' ını DOSYAM' a yazar.

syswrite (DOSYAM, $skalar, 40, 80); 

$skalar' da ki ilk 80 byte' ı atladıktan sonra sonraki 40 byte' ı, DOSYAM' a yazar.

Geniş bilgi için UNIX' in read ve write komutlarına bakınız.

getc Fonksiyonu Kullanarak Karakter Okuma : dosyadan bir karakter okur. Formatı;

$karakter = getc (dosya); 

döndürülen okunacak dosya karakter Örn:

$tek = getc(dosya); 

dosya' dan tek karakter okur, $tek ' e kopyalar.getc, hotkeys uygulamalarında çok yararlıdır. Örnek :

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl 

&hot_keys_baslat; 

while (1) { 

$tek_al = getc(STDIN); 

last if ($tek_al eq "\\"); # \ karakteri giriş sonu olacak 

$tek_al =~ tr/a-zA-Z0-9/b-zaB-ZA1-90/; # ne yazılırsa bir sonrakini elde eder 

print ($tek_al); 

} 

&hot_keys_son; 

print ("\n"); 

sub hot_keys_baslat { 

     system ("stty cbreak"); 

     system ("stty -echo"); 

} 

sub hot_keys_son { 

      system ("stty -cbreak"); 

       system ("stty echo"); 

}

Çalısması:

program çalıştığında siz ne yazarsanız bir sonrakini yazar. Yani a yazarsanız b , 1 yazarsanız 2 gibi...

-- Programdan çıkmak için \ tuşuna basınız .-- 

a1d yazarsak, ekranda b2e görünür. hot_keys_baslat alt programı, hot key girişi için çalışma çevresini düzenler. system fonksiyonu, argüman alır ve icra eder. stty -cbreak, bir anda bir karakter almasını sisteme söyler. stty echo ise yazılan karakterin ekranda görülmemesini söyler. hot_keys_son altprogramı ise normal çalışma moduna döndürür.

binmode Fonksiyonu :

bu fonksiyon kullanılarak binary dosya okunur. Format;

binmode (dosya değişkeni); 

binmode (DOSYAM); 

normalde DOS ve benzeri çevrede çalışmadıkça buna ihtiyacınız yoktur.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır