|
|
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.
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.
Kullanımı sona eren dosyalar close fonk. ile kapatılır. Örnek:
close (DOSYAM); # Dikkat ! close (bilgi.dat) değil.
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 |
-d | Dosya bir dizin mi? |
-e | Dosya mevcut mu? |
-f | Dosya normal (sıradan) dosya mı? |
-l | Dosya sembolik link mi? |
-o | Dosyanın sahibi kullanıcı mı? |
-r | Dosya okunabilir dosya mı? |
-s | Dosya boş olmayan dosya mı? |
-w | Dosya yazılabilir dosya mı? |
-x | Dosya çalıştırılabilir dosya mı? |
-z | Dosya boş dosya mı? |
-B | Dosya bınary dosya mı? |
-O | Dosya sahibi sadece kendi gerçek kullanıcısı mı? |
-R | Dosya sadece kendi gerçek kullanıcısı tarafından mı okunabilir? |
-S | Dosya socket mi? |
-T | Dosya text dosya mı? |
-W | Dosya sadece kendi gerçek kullanıcısı tarafından mı yazılabilir? |
-X | Dosya 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. >
Ö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.
> 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.
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).
Ö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
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 >
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.
|
|