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 amacıyla
2.Yazma amacıyla
3.Ekleme Amacıyla
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.
Ör: 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.
Ör: open (APPENDFILE, ">>/home/ertan/rehber.dat");
Önemli Notlar:
-Bu modlardan default olanı okuma modudur.
-Bir dosya yazma modunda açılırsa içeriği tamamen silinir.
-Aynı anda aynı dosyaya hem okuma hemde yazma işlemi yapamazsınız.
-Ekleme moduyla açtığınızda sadece ekleme yapabilir ama o dosyadan o anda
okuma yapamazsınız.
-Eğer standart giriş (klavyeden dosyayayazılma) kullanılacaksa(<STDIN>;)
<STDIN>; için açma (open) işlemi yapılmaz.
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.
Ör: $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.
#!/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...
#!/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.
>
Not : 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.
Not : 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.
#!/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.
#!/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ı !!!
Not:
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
#!/usr/local/bin/perl
open (DOSYA1, "ilk") ||
die ("ilk dosya açılamadı !\n");
open (DOSYA2, "ikinci") ||
die ("ikinci dosya açılamadı !\n");
$satir1 = <DOSYA1>;
$satir2 = <DOSYA2>;
while ($satir1 ne "" || $satir2 ne "") {
if ($satir1 ne "") {
print ($satir1);
$satir1 = <DOSYA1>;
}
if ($satir2 ne "") {
print ($satir2);
$satir2 = <DOSYA2>;
}
}
Çalışması:
>dosya6.pl
a1
b1
a2
b2
a3
b3
STANDART GİRİŞ ÇIKIŞ YÖNLENDİRMESİ:
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
#!/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ı !!!.
>
Not :
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.
#!/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!!!
>
Not : -e yanındaki ifadede değişken de kullanılabilir
Ör: $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....
BAZI DOSYA TEST OPERATÖRLERİ
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.
#!/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.
>
Not : 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.
#!/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.
>
Not : -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.
#!/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.
#!/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:
Komut satırından verilen birden fazla dosya adı ile <,>,; karakterleri özelliklerini kullanarak birden çok dosya bilgilerine erişilebilir.
Hatırlayacaksınız, $liste = <DOSYAM>; şeklindeki kullanım ile DOSYAM adlı dosyanın kayıtları
$liste değişkenine alınıyordu.Pekala birden fazla dosyayı nasıl okutacağız? Varsayalım ki,
Elimizde okutulacak 2 dosya var (daha fazla da olabilir) ve adları ise alan.dat ve bilgi.dat
Kodlayacağımız programımızın adı da program.pl olsun.
önce komut satırından şu komutu gireriz:
> 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.
Not : 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.
#!/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.
>
Not:
dosya13.pl komutunu girerken dosya adlarını yazmasaydık standart input(<STDIN>) tan giriş beklerdi.
Ek Not -1-:
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.
Ek Not -2-:
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.
#!/usr/local/bin/perl
print ("Aranan Kelime: $ARGV[0]\n");
# ekrandan girdiğimiz Bu kelimesini ekrana yazar.
$dosyasayisi = 1;
$toplamkelimesayisi = 0;
while ($dosyasayisi <= @ARGV-1) {
unless (open (OKUNAN, $ARGV[$dosyasayisi])) {
die ("$ARGV[$dosyasayisi] açılamadı\n");
}
$kelimesayisi = 0;
while ($kayit =<OKUNAN>;) {
chop ($kayit);
@kelimelerdizisi = split(/ /, $kayit);
$w = 1;
while ($w <= @kelimelerdizisi) {
if ($kelimelerdizisi[$w-1] eq $ARGV[0]) {
$kelimesayisi += 1;
}
$w++;
}
}
print ("$ARGV[$dosyasayisi] içinde bulunan : ");
print ("$kelimesayisi\n");
$dosyasayisi++;
$toplamkelimesayisi += $kelimesayisi;
}
print ("Toplam : $toplamkelimesayisi\n");
Ç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
#!/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.