DOSYALAR    - 2 -

 

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

 

Not: 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

 

 

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 :

#!/usr/local/bin/perl

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

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

print STDOUT ("Satir 1\n");        

print STDERR ("Satir 2\n");       

close (STDOUT); 

close (STDERR); 

 

ç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 :

 

#!/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.

 

Not : 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ı;

#!/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 --

 

Not:  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 :

#!/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 :

 

#!/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:  

         #!/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

 

Not: 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;

 

read       :         unix' de ki fread fonksiyonu gibidir 

sysread  :         read fonksiyonuna eş değerdedir.

 

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);

      

                                                                                                            ( isteğe bağlı )

            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.

 

Not: 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 :

#!/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);

 

 

DİRECTORY YÖNETME FONKSİYONLARI

 

mkdir Fonksiyonu : DIR yaratır. Formatı;

 

mkdir (DizinAdı, İzinDurumu);

 


            isim                 (octal değer)

 

Örnek:

 

mkdir ("/u/pub/dene", 0777);

mkdir ("yeni", 0644);    gibi ...

 

İzin Listesi:

0 : Hak yok

1: icra hakkı

2:yazma hakkı

3:yazma ve icra hakkı

4:okuma hakkı

5:okuma icra hakkı

6:okuma yazma hakkı

7:tüm haklar

Ör: chmod 751 dene.dat

Anlamı :

 

dene.dat dosyası üzerinde ;

Dosya sahibinin her hakkı -7-vardır.

Aynı gruptakilerin okuma ve icra hakkı-5- var.

Diğerlerinin sadece icra hakkı -1-var.

 

  4000   userID icra

                         2000   grupID icra

                         1000   sticky bit

                         0400   sahibi okur

                         0200   sahibi yazar

                         0100   sahibi icra eder

                         0040   sahibin grubu okur

                         0020   sahibin grubu yazar

                         0010   sahibin grubu icra eder

                         0004   diğerleri okur

                         0002   diğerleri yazar

                         0001   diğerleri icra eder

                         0777   Herkesin her hakkı var(okur,yazar,icra eder)

                         0444   Herkes okur

                         0111   Herkes icra eder .. gibi

 

 

chdir Fonksiyonu : DIR değiştirir.

 

Örnek : chdir ("/u/pub/yeni");

 

Çalışmak için path’de verilen (yukardaki örnekte-/u/pub/yeni-  Dizinine geçilir.

 

Önceki öğrendiklerimizlerden yararlanarak şu şekilde de kullanabiliriz.

$dir="/u/pub/";
chdir ($dir . "yeni")

opendir Fonksiyonu : Dizindeki dosya listelerini almak için kullanılır.

opendir (DIRdegiskeni,DIRadı);

DIRdegiskeni : DIR’ı temsil etmesi için kullanılır.

DIRadı : açılacak DIR

Örnek :           opendir (DIR, "/u/pub/yeni");

                       DIR, /u/pub/yeni  ‘yi temsil eder.

Closedir Fonksiyonu : Açılmış DIR (dizin) kapatır.

closedir (DIR);

readdir Fonksiyonu : DIR açıldıktan sonra içindeki dosyalara veya alt dizinlere erişimi sağlar.

readdir (dir);
 
Örnek : 
#!/usr/local/bin/perl
opendir(HOMEDIR, "/home/ertan/perl") ||
       die ("açılamadı");
while ($dosyaadi = readdir(HOMEDIR)) {         
        print ("$dosyaadi\n");        
  }
  closedir(HOMEDIR);
 
Çalışması;  $ program.pl
 
lo.pl
gazi.pl
gazi1.pl
user-ekle
passwd_ekleyen.txt
db-script
guestbook
order.htm
formmail.pl
register.pl
register.htm
kidofwais.pl
wais
msq-db-query
msq-db-query.save
db-ac.html
db-ara.html
anim.pl
db-cikti.html
db-detay.pl
db-ara.pl
 
Şimdide listeyi sıralayarak veren bir program;
 
Örnek : 
#!/usr/local/bin/perl
opendir(HOMEDIR, "/home/ertan/perl") ||  die ("açılamadı");
@dosyalar = readdir(HOMEDIR);     
closedir(HOMEDIR);
 foreach $dosyaadi (sort @dosyalar) {         
        print ("$dosyaadi\n");    
 }
 
Çalışması; program.pl         Çalıştırıldığında DIR, alfabetik olarak listelenir.
...
...
...
sub7.pl
tamkelime-ara.pl
tree1
tumdeara
tumdosyada-strara
until1
user-ekle
usprg.pl
wais
while1
yazilandosya
yeni
zaman
 
 
telldir ve seekdir Fonksiyonları : Bunlarda tell ve seek gibi işlev görürler. Fark olarak dosya değil dizin içindeki dosyalar arasında ileri geri atlama imkanı sağlarlar.
 
               telldir formatı;
                                              dosyalistesindedosyanınkonumu = telldir(dir);   
               seekdir formatı;
                                  seekdir(dir, dosyalistesindedosyanınkonumu);
dir değeri,  dosyalistesindedosyanınkonumu değerine set edilir.
 
rewinddir Fonksiyonu : DIR içindeki dosya listelerinin başına döner tekrar başlatma (okumaya, listelemeye) imkanı verir.
 
               Formatı;                               rewinddir (dir);
 
rmdir Fonksiyonu : Bu fonksiyon boş DIR’ı siler.
               
               Formatı;                               rmdir (dir);
 
Dır silinirse 0 olmayan değer döner aksi 0’dır.
 
DOSYA NİTELEME FONKSİYONLARI
 
               Perl ,dosyaların davranışlarını  niteleme, düzenleme fonksiyonları sunar. 
 
Başlıcaları;
 
·             ·             ·             İsimdeğiştirme-silme fonksiyonları
·             ·             ·             Link, sembolik link kurma fonksiyonları
·             ·             ·             Dosya izinlerini düzenleme fonksiyonları
·             ·             ·             Diğer nitelik fonksiyonları
 
Relocation (taşıma, isimdeğiştirme, silme) Fonksiyonları :
 
               İki adet fonksiyonu vardır.
 
               rename   : taşır veya isim değiştirir.
               unlink     : siler
 
Rename Fonksiyonu : 
 
rename (eskiad,  yeniad);
rename ("eski", "yeni");
rename ($eski, &yeniad_al);
rename ("/u/pub/eski", "/u/pub/yeni");
 
taşıma işleminde rename(“eski”, “yeni”);
böyle durumlarda –e (mevcut mu?) ile test edip işlemi yapabiliriz.
...  -e “yeni” || rename (eski, yeni);    gibi...
 
unlink Fonksiyonu :
 
Formatı :            degisken = unlink (dosyalistesi);
                                    
                  Silinendosyalar             1 veya fazla dosya            
Örnek : 
@silineceklistesi = ("dosya1", "dosya2");
 
unlink (@silineceklistesi);
 
delete yerine unlink ismini almasının sebebi şudur. Aslında o dosya’a yapılan referans veya link yok edilir. Linklerle ilgili bilgileri inceliyelim.
 
Link ve Symbolic Link Fonksiyonları : Aslında UNIX’de dosyalar birden fazla DIR içerebilirler. Aynı zamanda her bir DIR, dosyaya bir referans veya link  içerir. Aşağıda link yaratılması ve erişimi izah ediyor.
 
Not : Bir dosyaya birden çok link refere edilmişse, unlink birisini siler. (ve tabii dosya hala
referanslıdır.)
 
Link Fonksiyonu : Mevcut dosyaya link yaratır. (hard link)
 
               link (yenilink, dosya)
               
                   Yaratılan   link edilen dosya
                       Link
 
Link başarılı ise true döndürür.
 
Örnek : link (“/u/pub/dosya”, “/u/ertan/yenidosya”);
 
Link yaratıldıktan sonra ilerde unlink aşağıdaki gibi kullanılmışsa
 
unlink (“/u/pub/dosya”);
 
“/u/ertan/yenidosya” ‘ya referans hala mevcuttur.

Symlink Fonksiyonu  : Sembolik link oluşturur.

            symlink(yenilink, linkdosyası);

             Yeni  yaratılan link       link edilen dosya     
 
symlink("/u/pub/dosya", "/u/ertan/yenidosya");
 
komutla, /u/ertan/yenidosya,        /u/pub/dosya’ ya sembolik linklenmiştir.
 
Şimdi unlink (“/u/pub/dosya”) komutu ile dosya silinirse artık  /u/ertan/yenidosya 'a link kalmamıştır. 
Eğer /u/pub/dosya yeniden yaratılırsa eski sembolik link (/u/ertan/yenidosya) yeniden oluşur.
 
Readlink fonksiyonu : Link olan dosyanın adını okur. 
 
Format;  dosya = readlink (linkadı);
                                
                    Dosya Adı                sembolik link
 
               Yani eğer “/u/ertan/yenidosya” bir başka dosyaya sembolik linkli ise readlink link edilmiş dosyanın adını döndürür.Readlink eğer sembolik link yoksa boş string döndürür.
 
$linkname = readlink("/u/ertan/yenidosya");
 

               içeriği /u/ertan/yenidosya dır.
 
Örnek : sembolik linkli dosyaları bastıran bir program
 
#!/usr/local/bin/perl
$dir = "/home/ertan/perl";  
opendir(MYDIR, $dir);
while ($ad = readdir(MYDIR)) {
        if (-l $dir . "/" . $ad) {
         print ("$ad soft link: ");
         print (readlink($dir . "/". $ad) . "\n");
        }
}
closedir(MYDIR);
 
Çalışması; 
(Not:Önce   mkdir dene  ve ln -s dene dene1 komutlarını girelim ve dene isimli DIR(dizin)açarak bunu dene1 dosyasina soft(symbolic) linklemiş olalım.Sonra da aşağıdaki komutla programı çalıştıralım.)
        $ program.pl
         dene1 soft link: dene      
        $ 

 

İzin Hakları :

 

chmod : Erişim izni hakkı.

chown : Sahibini belirleme ,değiştirme.

umask : Default erişim izin hakkı

 

Chmod (izin, dosyalistesi) ;

 

Örnek :

@dosyalist = ("dosya1", "dosya2");
 
chmod (0777, @dosyalistesi);  


 

                   dizide isimleri bulunan dosyalara rwx(7) hakları verilir.

 

chown Fonksiyonu :

 

chown (user-kimlik, group-kimlik, dosyalistesi);

                 

            numeric      numeric        dosya (lar)

             user ID      grup ID

                           (mevcut grup ID

                           korunacaksa -1)

 

Örnek :

@dosyalist = ("dosya1", "dosya2");
 

            chown (17, -1, @dosyalist);

 

            Unix’te user-ID ve grup ID /etc/passwd dosyasından alınabilir.  Perl’de getpwnam sistem

fonksiyonu (Sistem fonksiyonları konusunda incelenecek) bu işi görür.

 

umask Fonksiyonu :

 

            Bir dosya/DIR yaratırken onun default bir erişim izin hakkı olsun. İstersek bu işlemi umask ile gerçekleştiririz.

 

Syntax : umask değeri=umask(yeni umask değeri)

 

Örneğin bundan sonra yaratılacak dosyalardan grup erişimi ve herkese erişimi kaldırmak istiyorsak

 

            $izin=umask(0022);

           

            yeni değeri tutar

 

            Eğer umask’ı , umask() şeklinde kullanırsak şu anki değeri atar.

 

                               İZİNLERLE İLGİLİ DOSYA TEST OPERATÖRLERİ

 

Operatör

Açıklama

 -g

Dosya grup ID bit setine sahip mi ?

 -k

Dosya sticky bit setine sahip mi ?

 -r

Dosya okunabilir dosya mı?

 -u

Dosya user ID bit setine sahip mi ?

 -w

Dosya yazılabilir dosya mı?

 -x

Dosya icra  edilir dosya mı?

 -R

Sadece gerçek user mı okuyabilir?

 -W

Sadece gerçek user mı yazabilir ?

 -X

Sadece gerçek user mı icra edebilir?

 

 

DİĞER NİTELİK ÖZELLİKLERİ :

 

truncate Fonksiyonu : dosya uzunluğunu kısaltır.

 

            truncate (dosya,  uzunluk);

 

          sabit ve değişken             dosya’ın yeni uzunluğu (byte)

                 olabilir                       eğer dosya uzunluğu

truncate (DOSYAM, 5000) gibi     bu rakamdan  kısa ise bir şey yapmaz

 

stat Fonksiyonu : Dosya ile ilgili bilgi verir.

 

Örnek :  stat (dosya);

           

            Dosya adı veya

            Dosya adı içeren değişken

 

stat bir liste döndürür

 

 

Stat ile Döndürülen Bilgiyi Kontrol Eden Dosya Test Operatörleri :

 

Operatör

Açıklama

-b

Blok device mı? (mount edilebilir disk mi?)

-c

Character device mı? (bir I/O device mı?)

-s

Boş olmayan dosya mı?

-t

Bir terminalimi temsil ediyor?

-A

Ne kadar önce erişildi?

-C

İnode erişimi ne kadar zamanda yapıldı?

-M

Düzenleme ne zaman yapıldı?

-S

Dosya socket mi?

 

Not: Ek bilgi için unix’in stat komutuna bakınız.

 

require fonksiyonu: Bir dosyayı, programınıza eklemek için kullanılır. Diyelim ki

dosyam.pl isimli dosya var. Bunu programımızın bir parçası olarak almak istiyoruz.

 

require ("dosyam.pl"); 

 

komutu bu işlevi yerine getirir. Perl, require'ı görünce o dosyayı default dizini tutan @INC' de arar. Bulunursa file içindeki ifadeler icra edilir. Bulunamazsa program hata mesajı vererek  kesilir.

(dosyam.pl, @INC dizininde bulunamadı gibi..)

bir altyordam çağrısı içinde iken çağrılan dosyanın (örneğin dosyam.pl)  son ifadesi dönüş değeri olur

 

örneğin, dosyam.pl in son satırı:

 

$degisken = 14;   ise bu değer(14) dönüş değeri olur.(0'dan farklı değer).

$degisken = 0;     ise dönüş değeri 0 olur. Bu durumda; dosyam.pl did not return true value

mesajı çıkar.

 

NOT: Bu durumlarda  çağrılan dosya uzantıları normalde .pl dir. Herhangi bir scalar değeri require' e

geçirebilirsiniz. Aşağıdaki kodlama geçerlidir.

 

@reqlistesi = ("dosya1.pl","dosya2.pl", "dosya3.pl");

require ($reqlistesi[$0]);

require ($reqlistesi[$1]);

require ($reqlistesi[$2]);

 

Eğer require; şeklinde dosya isimsiz olarak kodlanırsa, $_ değişkeninin değeri olan dosya alınır ve icra

edilir.

 

NOT: Bir dosya sadece bir kez require ile alınabilir. Bu dosyanın herhangi bir kod bloğu bir çok kere

Gerekirse system veya eval kullanılmalıdır.

 

REQUIRE FONKSİYONU VE ALTYORDAM KÜTÜPHANESİ

 

require , altyordam kütüphanesi yaratma imkanı da verir ve onları tüm perl programlarında kullanabilirsiniz.

 

Altyordam kütüphanesi yaratma adımları:

1-     Kütüphane ' nin hangi <DIR> da oluşturulacağını kararlaştır.

2-     Altyordamları değişik file' lara ayır ve bu <DIR>'a kaydet.

3-     Her bir file' a 0 olmayan değer döndürmesi(true) için icra edilebilir bir ifade ekle. Ayrıca bir boş programda 0  döndürür. Bunun en kolay yolu programın en sonuna 1; eklemektir.

4-     programı çalıştırdığınızda -I seçeneğini kullanarak altyordam dizininin (<DIR>) adını tanımlayınız.

[Alternatif olarak require' ı çağırmadan önce @INC dizisine, altyordam<DIR> ını da ekleyebilirsiniz. )

Örneğin; /u/ertan/perl/sub/dosya.pl    için

(Dosya altyordamını içeren dosya; dosya.pl

<DIR>(dizin) de yukarıdaki  dizin (/u/ertan/perl/sub) )

bu durumda,

unshift (@INC, "/u/ertan/perl/sub");

require ("dosya.pl");   

kodunu kullanırız.

unshift çağrısı, /u/ertan/perl/sub  dizinini @INC dizisine ekler.

Daha sonra o an çalışan programın parçası olarak, require buradan  okur.]

 

NOT: @INC ' e eklemek için unshift kullanın push değil. Çünkü push en sona ekler ve bu durumda

DIR' ın taranması gerekir.

 

 

ÖZEL DAHİLİ DEĞERLER

 

Üç tanedir.

 

__ LINE __ -àprogramın son satırı

__ FILE __ -àprogramın son dosyası

__ END __ -àdosyanın sonu

 

die ve warn ile kullanılan değerlerdir. __ LINE __   ve   __ FILE __ hata anında satır no ve file adını

kullanırlar.

__ END __  ise dosya sonu anlamında olup bundan sonraki satırlarda datalar bulunur .DATA değişkeni ile birlikte kullanılır.(__ END __ sonrası data olarak değerlendirilir).

Daha önce de gördüğümüz şu örneği hatırlayalım.

Örnek 
#!/usr/local/bin/perl
$kayıt = <DATA>;
print ("$kayıt");
__END__
Bu benim kayıtım.
 
Çalışması;
$ program.pl
Bu benim kayıtım.
$
 
Programda _END_ program sonunu belirler. 2.satır DATA özel  dosyasını okur.Okunan kayıt ise  _END_ den sonraki ilk satırdır ve bu satır $kayıt değişkenine alınır.

 

 

 

DBM Dosyaları Kullanımı :

 

(database management: veri tabanı yönetimi)

 

Perl DBM dosyalarına erişimi sağlayan dbmopen ve dbmclose fonksiyonlarına sahiptir.

Bunlar tie ve untie fonksiyonları ile aynı işi görür. Fark perl5 version farkıdır.

 

dbmopen Fonksiyonu :

 
Formatı : dbmopen (dizi, dbmdosyası, permissions);

 


                               Kullanılacak   açılacak         erişim izin hakkı

                               Birleşik dizi    DBM dosyası

 

DBM dosya açıldığında, bu dosyanın key leri, bileşik dizinin index’li olurlar (onları temsil ederler). ,

Değerlerine ise bu yöntemle erişilir.

dbmopen, mevcut bileşik dizi varken açılırsa dizi içerikleri silinir.

 

 

dbmclose Fonksiyonu : dbmopen ile açılan DBM dosyalarını kapatır.

 

               dbmclose (dizi);

                                     database dosyası ile ilişkili olan birleşik dizi