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

STANDART GİRİŞ ÇIKIŞ YÖNLENDİRMESİ:

Giriş

Bu işlevi >, < karakterleri sağlar. (Unix'teki gibi) Biliyoruz ki , $line = <>; komutu ile klavyeden bir satır girişi sağlanıyordu. Aynı komutu yazarak istenilen bir dosyadan nasıl giriş sağlayabiliriz. Şöyle; programadı < girisdosya > çıktıdosyaı komutu girildiğinde giriş için değerler girisdosya dosyasından alır ve çıktıyıda print ($line); komutuyla çıktıdosya dosyasına yazar.

STANDART HATA DOSYASI:

Buda hazır bir değişken kullanılarak halledilmiştir. Standart hata dosyası <STDERR> dir ve ekranı temsil eder. Ekrana çıkmasını istemezsek başka bir dosyaya yönlendirme ile gönderebiliriz. Örnek program : Standart hata(error) kullanımlı program. dosya adı dosya7.pl olsun

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

  open(DOSYAM, "bilgi.dat") ||

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

  print STDERR ("bilgi.dat dosyası başarıyla açıldı !!!.\n");

  $kayit = <DOSYAM>;

  while ($kayit ne "") {

          chop ($kayit);

         print ("\U$$kayit\E\n");  # Büyük harfe çevirerek basar

         $line = <DOSYAM>;

  }

Çalışması: (bilgi.dat dosyası mevcut varsayıyoruz)

>dosya7.pl

    bilgi.dat dosyası başarıyla açıldı !!!.

>

die () fonksiyonu çıktıyı standart output(çıktı) değil standart error(hata) dosyasına yollar. Bu demektir ki die() fonk.mesajları daima ekrana çıkar.

DOSYA KAPATMA:

Kullanımı sona eren dosyalar close fonk. ile kapatılır. Örnek:

close (DOSYAM);  # Dikkat !   close (bilgi.dat)   değil.

DOSYA STATÜSÜNÜ BELİRLEME - TEST OPERATÖRLERİ KULLANIMI:

Statüye karar verme: Dosya işlemlerinde bir çok şeyi test etmeye ve dosya durumunu belirlemeye ihtiyacımız olabilir. Örneğin: Dosya mevcut mu? text dosyası mı? Okunabilir mi? Boş mu? v.b... Bunları belirlemek için kullanılan operatörler vardır.

Ör : dosya test operatörü kullanımlı bir program. program adı dosya8.pl olsun.Açılmamış bir dosyanın varlığını test ediyor.

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

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

        if (-e "bilgi.dat") {      # -e  dosya test operatörüdür.

                                                    # Dosya mevcut mu? test eder.

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

          } else {

                die ("bilgi.dat dosyası mevcut değil!!!.\n");

          }

  }

$kayit = <DOSYAM>;

 while ($kayit ne "") {

         chop ($kayit);

         print ("\U$kayit\E\n");

         $kayit = <DOSYAM>;

 }

Çalışması: (varsayalım ki dosya mevcut olmasın)

>dosya8.pl

    bilgi.dat dosyası mevcut değil!!!

>

-e yanındaki ifadede değişken de kullanılabilir

$var = "file1";

if (-e $var) .... 

veya

$var = "file1";

        if (-e $var . "a")   gibi.. (burada file1a isimli dosya sözkonusu)

perl, if (-e $var . "a") ifadesini . karakterinin(stringte birleştirme) önceliğinden dolayı karıştırmaz. string'te tam yol da belirtilebilir.Ör:

if (-e "/u/ertan/bilgi.dat") ...   gibi....

Operatörİzah
-dDosya bir dizin mi?
-eDosya mevcut mu?
-fDosya normal (sıradan) dosya mı?
-lDosya sembolik link mi?
-o Dosyanın sahibi kullanıcı mı?
-rDosya okunabilir dosya mı?
-sDosya boş olmayan dosya mı?
-wDosya yazılabilir dosya mı?
-xDosya çalıştırılabilir dosya mı?
-z Dosya boş dosya mı?
-BDosya bınary dosya mı?
-ODosya sahibi sadece kendi gerçek kullanıcısı mı?
-RDosya sadece kendi gerçek kullanıcısı tarafından mı okunabilir?
-SDosya socket mi?
-T Dosya text dosya mı?
-WDosya sadece kendi gerçek kullanıcısı tarafından mı yazılabilir?
-XDosya sadece kendi gerçek kullanıcısı tarafından mı çalıştırılabilir?
gerçek kullanıcı:loginden girilen kullanıcı adı

Örnek program: program adı dosya9.pl. Program yazma amaçlı bir dosya açarken mevcut mu kontrolü yapar.

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

  unless (open(OKUNACAK_DOSYA, "okunandosya")) { 

      die ("okunandosya adlı dosya açılamadı.\n"); 

     } 

  if (-e "yazilandosya") { 

          die ("Halihazırda yazilandosya adlı bir dosya var.\n"); 

     } 

  unless (open(YAZILACAK_DOSYA, ">yazilandosya")) { 

         die ("yazilandosya adlı dosya açılamadı.\n"); 

     } 

 $kayit = <OKUNACAK_DOSYA>; 

 while ($kayit ne "") { 

         chop ($kayit); 

         print YAZILACAK_DOSYA ("\U$kayit\E\n"); 

       $kayit = <OKUNACAK_DOSYA>; 

 }

Çalışması:

>dosya9.pl 

 Halihazırda yazilandosya adlı bir dosya var. 

>

Eğer yazilandosya olmasaydı,okunandosya kayıtları(satırları) yazılandosya adlı dosyaya Büyük harflere çevrilerek aktarılacaktı.

Örnek program parçası : Dosya üzerinde okuma hakkı var mı? test eder. Program Adı dosya10.pl dosya.txt dosyasının varolduğunu ama okuma hakkı olmadığını varsayalım.

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

 unless (open(DOSYAM, "dosya.txt")) { 

       if (!(-e "dosya.txt")) { 

             die ("dosya.txt isimli dosya bulunamadı.\n"); 

       } elsif (!(-r "dosya.txt")) { 

             die ("dosya.txt isimli dosyayı okuma hakkınız yok.\n"); 

       } else { 

             die ("dosya.txt açılamadı.\n"); 

       } 

 }

Çalışması:

>dosya10.pl 

 dosya.txt isimli dosyayı okuma hakkınız yok. 

> 

-r kullanımından önce -e operatörü testine gerek yoktur. Çünkü -r de dosyayı bulamasa yanlış (false) değeri döndürür. -r ve -e nin birlikte kullanım amacı tam olarak hatanın nerede olduğunun tesbiti olabilir.

Örnek program : Dosya adı :dosya11.pl Dosyanın yazmak için açmadan önce boş olup olmadığını test eden program parçası Dosya var ve dolu olsun varsayalım.

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

  if (-e "dosya.dat") { 

         if (!(-w "dosya.dat")) { 

                 die (" dosya.dat dosyasına yazma hakkınız yok.\n"); 

          } 

          if (!(-z "dosya.dat")) { 

                  die ("dosya.dat dosyası boş değil.\n"); 

         } 

 } 

 # Bu noktada dosya ya boş yada mevcut değildir ve yazma amaçlı açılabilir.

>dosya11.pl 

   dosya.dat dosyası boş değil. 

>

Örnek Program: Bu program,-s operatörü kullanarak,standart giriş aracılığıyla dosya büyüklüğünü döndürür ve ekrana basar(yazar). Program adı dosya12.pl olsun.

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

print ("Dosya adını giriniz:\n"); 

  $dosyaadi = <STDIN>; 

  chop ($dosyaadi); 

  if (!(-e $dosyaadi)) { 

          print ("$dosyaadi adlı dosya mevcut değil.\n"); 

  } else { 

          $size = -s $dosyaadi; 

         print ("$dosyaadi dosyası  $size byte içeriyor.\n"); 

 }

Çalışması:

>dosya12.pl 

    Dosya adını giriniz: 

    bilgi.dat 

    bilgi.dat dosyası 128 byte içeriyor. 

> 

DOSYA DEĞİŞKENLERİYLE TEST OPERATÖRÜ KULLANIMI:

Ör: Dosya değişkenimiz DOSYAM ise;

if (-z DOSYAM) { 

	print ("Bu dosya boş!\n"); 

} 

kodlaması ile DOSYAM ın temsil ettiği (mesela bilgi.dat) dosyanın durumu test edilir.

DOSYA DİZİSİ OKUMA:

>   program  alan.dat  bilgi.dat 

ve enter tuşuna basarız bundan sonra program satırları içinde şu şekilde bir kodlama gerekir ki 3 dosyayı da arka arkaya kullanabilelim.

$liste = <>;         ( $liste = <DOSYAM>; kullanımını hatırlayın ve farkı görün) 

işte bu satır sayesinde her bir dosyanın işi bitince diğeri devreye girer. Yukarda ki izahlardan sonra daha iyi anlamak için bir program yazalım ve çalıştırıp işleyişi görelim. Ekrandan adı girilen 2 dosyanın (alan.dat ve bilgi.dat olsun)içeriğini ekrana basan program.

alan.dat ve bilgi.dat dosyaları içeriği aynıdır ve kayıtları şunlardır:

Bu ilk kayıttır. 

İkinci kayıt. 

Dosyadaki son kayıt ve kodladığımız programın adı dosya13.pl olsun.

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

 while ($gir = <>;) {            # sıradaki dosyadan,sıradaki satır alınıp $gir 'e atanıyor 

    print ($gir);  # ve değişken içeriği yazdırılıyor(Son dosyanın sonuna kadar devam eder) 

 }

Çalışması:

>dosya13.pl alan.dat bilgi.dat 

Bu ilk kayıttır. 

İkinci kayıt. 

Dosyadaki son kayıt. 

Bu ilk kayıttır. 

İkinci kayıt. 

Dosyadaki son kayıt. 

> 

dosya13.pl komutunu girerken dosya adlarını yazmasaydık standart input(<STDIN>) tan giriş beklerdi.

Dosya adı DOSYAM ise, <DOSYAM> kullanımını hatırlayalım.

Skalar değişken kullanarak skalar değişken içeriği ne ise dosya adı olarak onu kullansın İstiyorsak;

  $dosyaadi = "DOSYAM"; 
	
	$kayit = <$dosyaadi>; 

kodlamasını kullanırız. $dosyaadi değişirse okunacak dosyada değişmiş olur.

Unix' ten hatırlatma

$ cp *.pl /u/ertan 

komutu dizindeki .pl uzantılı ne kadar dosya varsa /u/ertan <DIR>'na kopyalar. İşte <> nin, cp komutunun burada birden çok dosyayı elde edip kopyalaması mantığına benzeyen Bir kullanımı vardır. Örneğin;

@dosyalistesi = <*.pl>; 

kodlaması *.pl olan tüm dosyaları @dosyalistesi dizisine listeler.Döngüde de kullanılabilir. Örneğin;

while ($kayit = <*.pl>) { 

print ("$kayit\n"); 

}

tüm dosyalar (uzantısı .pl olan) arka arkaya listelenir.

DİZİLERE OKUTMA:

Değişkenlere okutma gibidir.Biraz evvel gördüklerimiz uygulanabilir. Tek farkla ki okutulan değişken skalar değişken değil dizi değişkenidir.

$liste = <DOSYAM>; yerine 

@liste = <DOSYAM>; kullanırız. 

Bu okutma işleminde dikkatinizi çekmek istediğim önemli bir nokta vardır. Şöyle ki; Bir dosyadan ,Skalar değişkene tek kayıt okunurken( $liste = <DOSYAM>; veya $gir = <>; gibi), dizi değişkenine tum dosya aktarılır( @liste = <DOSYAM>; veya @gir = <>; gibi).

KOMUT SATIRI ARGÜMANLARINI DEĞER OLARAK GİRME(KULLANMA):

Önceki programda,

>dosya13.pl alan.dat bilgi.dat

komutuyla alan.dat ve bilgi.dat'ı argüman olarak kullanmıştık. Perl bu argümanları değer olarak kullanan hazır bir dizi değişkeni sunar: @ARGV. Elde edilen argümanlar bu dizide dizi elemanlarını içeren bir liste olarak saklanır ve nasıl işimize yarayacaksa o amaca uygun kullanılabilirler.

Örneğimizden yola çıkarsak, >dosya13.pl alan.dat bilgi.dat kullanımıyla, @ARGV dizisi içeriği ("alan.dat","bilgi.dat") listesi olarak set edilir. Burada $ARGV[0] içeriği "alan.dat",$ARGV[1] içeriği ise "bilgi.dat",dır. @ARGV elemanlari tıpkı diğer dizi değişkenleri gibi karşılıklı atama işlemlerinde kullanılabilirler. Örneğin,

$var = $ARGV[0]; 

$ARGV[0] = 43;   ...gibi... 

Argüman sayısını elde etmek istersek @ARGV dizisini bir skalar değişkene atarız.

$arg_sayisi = @ARGV; 

$arg_sayisi skalar değişkenindeki değer argüman sayısını verir.

Örnek Program : Bu program kelime arar ve sayar. Program adı: dosya14.pl olsun. Programı çalıştırırken alan.dat ve bilgi.dat dosyalarının adlarını ve bu dosyalarda aratacağımız "Bu" kelimesini komut satırından gireceğiz.

Çalışması :

>dosya14.pl Bu alan.dat bilgi.dat 

Aranan Kelime: Bu 

alan.dat içinde bulunan:1 

bilgi.dat içinde bulunan:1 

Toplam : 2

ARGV ve <> Operatörü:

Gerçekte Perl de, <>; operatörü @ARGV dizisine bir referans (gönderme) içerir. <> görüldüğünde ilk file açılır ve adı $ARGV[0] içine atanır. Bu arada @ARGV içindeki ilk eleman silinir ve sonraki eleman bu ilk elemanın içine yerleşir (kaydırma işlemi- Bunu hazır shift(@ARGV) fonk.yapar;)

Örnek Program: <> kullanılan kelime arama ve sayma programı.Adı dosya15.pl

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

 $aranankelime = $ARGV[0]; 

 print ("Aranacak kelime: $aranankelime\n"); 

 shift (@ARGV); 

 $toplamkelime = $kelimesay = 0; 

 $filename = $ARGV[0]; 

 while ($kayit = <>) 

 { 

        chop ($kayit); 

        @kelimeler = split(/ /, $kayit); 

        $w = 1; 

        while ($w <= @kelimeler) 

              { 

                if ($kelimeler[$w-1] eq $aranankelime) 

                    { 

                     $kelimesay += 1; 

                    } 

                $w++; 

              } 

  

        if (eof) 

           { 

            print ("$filename: içindede bulunan: "); 

            print ("$kelimesay\n"); 

            $toplamkelime += $kelimesay; 

            $kelimesay = 0; 

            $filename = $ARGV[0]; 

           } 

 } 

 print ("Toplam : $toplamkelime\n");

Çalışması :

>dosya15.pl  Bu alan.dat bilgi.dat 

 Aranan Kelime: Bu 

 alan.dat içinde bulunan:1 

 bilgi.dat içinde bulunan:1 

 Toplam : 2 

>

LINK (HAT) AÇMA: --pipe--

Unixte 2 ayri işlemi likleme(piping) işlemi ile birleştirebiliyorduk. Bu işlem için | (pipe) karakteri kullanılıyordu. Bu özelliği perl de kullanır. örneğin aşağıdaki komutla,

open (MYPIPE, "| cat >hello");

MYPIPE açıldığında çıktı MYPIPE 'a gönderilir ve girdi cat >hello komutu olur. Aşağıda sistemdeki bir kullanıcıya perl programından mesaj gönderme örneği var.İncelersek daha iyi anlarız.

open (MESAJ, "| mail ertan"); 

print MESAJ ("Merhaba Ertan! Bu mesaj perl den mail gönderme denemesidir!\n"); 

close (MESAJ); 

Bu satırlarda İlkönce open komutuyla MESAJ dosya değişkeniyle , -mail ertan- komutuna bağlantı kurulur. Daha sonra MESAJ adlı dosya değişkeni içeriği olan yazılan mesaj bu hat(bağlantı) ile ilişkilendirilir ve close komutu ile mesajı içeren satır ertan isimli kullanıcıya gönderilir. giden mesajın içeriği:

Merhaba Ertan! Bu mesaj perl den mail gönderme denemesidir! 

olarak karşı taraftan okunacaktır.

Dosya Listesi

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