-ÇEŞİTLİ FONKSİYONLAR

 

Proses (İşlem-program ve komut işlem süreci) :

 

Perl çalışan ve diğer programların yönetimi için geniş bir fonksiyon yelpazesi sunar. Bunlar 4 grupta

incelenebilir.

 

1 - İlave proses başlatma

2 -  Çalışan program veya bir başka prosesi durdurma

3 - Program veya proses icra kontrolü

4 - Program veya proses yönetme (önceki kategorilere girmeyen)

 

Proses Başlatma : Proses yaratma ile ilgili prosesler eval, system, fork, pipe, exec, syscall’dır.

 

Eval : Bir karakter stringi, icra edilebilir perl programı gibi davranır.

 

Formatı;

            eval (string)

                       

Örnek :

$yaz = "print (\"Selam size !!!\ \n\");";
 
eval ($yaz);

 

Çıktısı,

               Selam size !!!

 

               Eval’in kullandığı string bir karakter string sabit veya bir ifade(değeri karakter string olmalı)

olabilir. Örnekte string önce $yaz sonra eval 'e geçirildi.

 

Eval’e geçirilen string

print ("Selam size !!!\n");   stringidir.

 

Eval fonksiyonu $@ sistem değişkenini kullanır. Bu değişken, icra edilebilir karakter stringini içereni

belirler. $@ içeriği null stringidir ve hata anında ,hata mesajı , @$ içinde oluşur. $@ içeriğinde bir şey

yoksa icra tamamdır.

 

Örnek :    eval örneği

 

   #!/usr/local/bin/perl
   $deger = 1;
   eval ("print (\"Merhaba!\\n\"); \$deger = 7;");
   print ("\$deger değeri: $deger\n");
 

Çalışması:  program.pl

 
Merhaba!
 
$deger değeri: 7
 
   eval önce 
               print(“Merhaba!\n”);
   sonra
               $deger = 7;       icra eder.
 
Örnek :  eval  fonksiyonu kullanarak  tell  fonksiyonu var mı, yok mu test eden program
 
#!/usr/local/bin/perl
open (DOSYAM, "dosya1") || die ("dosya1 açılamadı");
eval ("\$basla = tell(DOSYAM);");
if ($@ eq "") {
       print ("tell fonksiyonu tanımlı.\n");
} else {
          print ("tell fonksiyonu tanımlı degil!\n");
 
        }
 

Çalışması:   program.pl

        tell fonksiyonu tanımlı.
 

               Eval çok faydalı bir fonksiyondur. Küçük programlarda çok iyi kullanıma sahiptir.

Büyük programlarda ise onu dosyaya yazdırıp system  ile icra etmek daha iyidir.

 

system Fonksiyonu :

 

               Daha öncede görmüştük. system(Liste); fonksiyona geçirilen Liste’de ilk argüman icra edilecek program sonrakiler ise programa geçirilecek argümanlardır.

 

Örnek :

#!/usr/local/bin/perl
@liste = ("echo", "Perl Öğreniyorum!");
system(@liste);

 

Çalışması : program.pl

   Perl Öğreniyorum!
 

               System fonksiyonu ile program çalışırken çıktıda bazen karışıklık olabileceğini düşünerek bu problemin çözümü için $| sistem değişkeni set edilir. Her bir file için 1 tanımlanmalıdır.Bu tanım o dosya için buffer yok demektir. Böylece çıktılar sırayla olur.

 

                   select (STDOUT);

               $| = 1; select (STDERR);

               $| = 1;      gibi..

 

fork Fonksiyonu :

 

               Bu fonksiyon, programınızın iki kopyasını yaratır. Parent ve child proses bu kopyalar eş zamanlı çalışırlar.

 
Syntax: $prosesid_değişkeni = fork();
 
               Fork, child prosese 0, parent prosese 0 olmayan değer döndürür. Bu 0 olmayan değer child prosesin proses ID’sidir. Bu değer sizin hangi prosesin child, hangi prosesin parent olduğunu ayırmanıza yarar. 
 
Örnek :
$deger = fork();
if ($deger == 0) {
        # Burası child process
        exit;   # child proces sonu
} else {
        # parent proses
}
 
               Eğer fork çalışmazsa, dönüş değeri tanımlanmayan bir değerdir. Bu değer ilerde göreceğimiz defined fonksiyonuyla test edilebilir. fork fonksiyonu kullanırken dikkatli olunmalıdır. Mesela, her iki kopya da print ediliyorsa karışıklık olabilir, yine döngü kullanılıyorsa çok fazla kopya etkisi olur gibi...
 

pipe Fonksiyonu :

 

               fork fonksiyonu ile birlikte tasarlanmıştır. Bu fonksiyon child ve parent proses iletişimini sağlar.

 

formatı :  pipe (giriş_dosyası, çıkış_dosyası);


 

                        kullanımda olmayan 
                        dosya değişkenleri
 

Örnek :

#!/usr/local/bin/perl
pipe (GIRIS, CIKIS); # GIRIS ten okutabileceğini CIKIS' a gönderir
$prosesler = fork();    # program child ve parent prosese ayrılır
if ($prosesler != 0) {   # hangi prosesin child hangisinin parent olduğu test edilir
            # bu aşamaya gelindiğinde  parent prosestir. Parent proses datayı CIKIS yoluyla göndereceğinden,       
      close (GIRIS);  # GIRIS erişimine gerek yoktur.  Bu yüzden GIRIS’i kapatır.
      print ("Bir satır giriniz:\n");  
      $oku = <STDIN>; #Data standart girişten alınır ve 
      print CIKIS ($oku);                # CIKIS değişkeni yoluyla child prosese gönderilir 
} else {                                                                     
            # bu aşamada proses child prosestir ve bu yüzden  data GIRIS yoluyla alınacağından 
close (CIKIS); # CIKIS 'a gerek yoktur CIKIS kapatılır
$oku = <GIRIS>;    # GIRIS’den datayı okur.Çünki,data CIKIS’dan GIRIS 'e pipe edilmiştir                  
print ($oku);
exit (0);  #child proses exit ile ölür ve GIRIS otomatikman kaldırılır 
}
 

Çalışması :      program.pl

Bir satır giriniz :
Bu bir satırdır
Bu bir satırdır
$
 

exec Fonksiyonu :

 

Sistem fonksiyonuna benzer. Tek farkı yeni programa başlamadan önce o an çalışan  programı keser.

 

Formatı : exec (liste);

 


                               İlk eleman icra edilecek program

                                    sonrakiler ise argümanlardır.
 
exec ("mail ertan");
exec ("vi", "dosyam.dat");

 

program adı da kullanabilirsiniz.

 

exec sık sık fork ile kullanılır. fork iki prosese ayırdığında child, diğer programı exec kullanarak başlatır.

Daha önce system de bahsedilen buffer işlemleri , exec içinde geçerlidir.

 

syscall Fonksiyonu :

 

            Bir sistem fonksiyonu çağırır.

 

   syscall (liste);

 


Ilk argüman araya sokulacak sistem çağrısı, diğerleri bu çağrıya aktarılacak argümanlardır.

(UNIX syscall manual sayfalarını inceleyiniz).

 

            syscall kullanımında perl’in syscall.ph başlık dosyası dahil edilmelidir.

            [Ör: require ("syscall.ph")]

 

PROGRAM veya PROSES BİTİRME

 

die, warn, exit, kill

 

die ve warn Fonksiyonları :

 

Programlardaki önemli mesajları, gönderme fonksiyonlarıdır.

 

die fonksiyonu programı sonlandırır ve bir hata mesajı verir (standart error dosyasına )

 

               die (mesaj);

           

warn’da die gibidir. Yalnız programı sonlandırmaz, icra devam eder.

 

Örnek :

warn("UYARI!\n");
 
UYARI! (standart error dosyasına yazar)
 
exit Fonksiyonu :
 
               Programı sonlandırır.
 
               exit (dönüş kodu)


 

 Geçirilecek dönüş kodu 
 
              exit(2); #2 kodu ile programı bitirir.
 
kill Fonksiyonu :
 
kill (sinyal, proseslistesi);
                               

            nümerik sinyal   proses ID Listesi (fork ile döndürülen child proses ID gibi)

 

 

sleep Fonksiyonu :
 
               Bu fonksiyon verilen saniye sayısı kadar programı bekletir.
 
   sleep (time);
 

                    sn cinsinden sayı

 

               sleep(5); (5 sn bekletir)

 

wait ve waitpid Fonksiyonları :

 

wait fonksiyonu icrayı devreder ve child prosesin sonlanmasını belirler(fork ile yaratılan proses gibi). Bu fonksiyon argümansızdır.

 

proses_id = wait();

 

Burada child proses sonlanınca wait, proses ID’yi proses_id ‘ye atar. (Sonlanan prosesin ID’si. Eğer proses yoksa dönüş değeri –1 olur.)

 

waitpit ise üzerinde çalışmak istenilen child proses için bekler.

 

               waitpid (proses_id, waitflag);

 


                        proses ID         özel bekleme flag’ı default’u 0’dır(normal bekleme).

                beklenecek proses                          

 

Eğer 1 dönerse proses bulundu, -1 dönerse bulunmadı demektir.

 

Örnek :

#!/usr/local/bin/perl
$prosesid = fork();
if ($prosesid == 0) {
# burası child proses kısmı
print ("Basılan ilk satır\n");
exit(0);
} else {
# burası parent proses kısmı, $prosesid içine child prosesin ID’sini döndürür.
waitpid ($prosesid, 0);
print ("Basılan sonraki satır\n");
}

 

Çalışması :  program.pl

Basılan ilk satır
Basılan sonraki satır
Not : $$ sistem değişkeni, çalışan programın proses ID’sini tutar.

chroot Fonksiyonu :
 
               Bu fonksiyon root dizini tanımlar.
   chroot (dir);
 
                   yeni root DIR
 
   chroot ("/u/public");


 

                        burası yeni root DIR’ı olur.
 
local Fonksiyonu :
               Bunu alt program dersinde görmüştük.
Matematiksel Fonksiyonlar
Sin, cos, atan2, sqrt, exp, log, abs, rand, srand
 
sin(değer);
cos(değer);
atan2(değer1, değer2);
sqrt(değer);


 

                  pozitif
 
exp(değer)


 

          üs
 
log(değer);
abs(değer);
 
Örnek: $sonuç=$abs(-3.5);    #İçeriği 3.5’dir.
 
rand(deger)  #0 ile değer(int) arası sayı üretir.Üretilen değer float point’dır.
 
srand (değer); #rand fonksiyonu kullanarak random sayı üretimine başlatır.
 
 
String Yönetme Fonksiyonları
 
1. String'de, alt string arama
2. String yaratma
3. String içine sub string (alt string) yerleştirme işlevlerini göreceğiz
 
index Fonksiyonu :
 
String içinde ,soldan başlayarak verilen örneği (substringi) arar.Bulduğunda kaçıncı karakterde 
olduğu bilgisini(pozisyonu) elde eder.
               pozisyon=index(string, substring);
substring, stringde bulunursa, kaçıncı karakter olduğunu ifade eden rakam, pozisyon 
değişkenine  atılır bulunamazsa –1 atılır.
 

Örnek :

#!/usr/local/bin/perl
$oku = <STDIN>;
$pozisyon = index($oku, "tan");
if ($pozisyon >= 0) {
          print ("tan sözcüğününün bulunduğu pozisyon: $pozisyon \n");
} else {
          print ("tan sözcüğü  bulunamadı \n");
}
 

Çalışması : program.pl

Benim adım Ertan TURKMEN
tan sözcüğününün bulunduğu pozisyon: 13
 
 
index 3 argümanlı da tanımlanabilir. 3. argüman substring'in aranmasına kaç karakter atlandıktan sonra başlanacağını belirler.
 
$position = index($oku, "tan", 5);
 
               $oku içinde, tan kelimesi 5 karakter atlandıktan sonra aranmaya başlanır.
Bulunamazsa –1 döner.
 

Örnek :

#!/usr/local/bin/perl

$oku = <STDIN>;

$pozisyon = $bulunan = 0;

while (1) {

      $pozisyon = index($oku, "tan", $pozisyon);

      last if ($pozisyon == -1);

          if ($bulunan == 0) {

                 $bulunan = 1;

                 print ("Sözcük bulundu - Atlanan karakter sayısı:");

           }

      print ("$pozisyon");

      $pozisyon++;

 }

if ($bulunan == 0) {

         print ("Sözcük bulunamadı\n");

 } else {

         print ("\n");

       }

 

Çalışması : program.pl

Adin Ne? Benim ismim Ertan
Sözcük bulundu - Atlanan karakter sayısı:23
$

 

rindex Fonksiyonu :
 
               index fonksiyonuna benzer tek farkı taramaya soldan değil sağdan başlamasıdır.
 
               pozisyon = rindex (string, substring);
 
Örnek :
               #!/usr/bin/perl
               $string = "Benim adım Ertan";
               $pozisyon = rindex($string, "tan");
               print $pozisyon;
 
               tan substringi, string içinde sağdan aranmaya başlar, bulunduğunda pozisyonu soldan kaçıncı karakterse o dur.Yukarıdaki örnekte pozisyon 13’dür. İndexle ilgili tüm kurallar bunun içinde geçerlidir.
 
length Fonksiyonu :
 
               Bir karakter stringinin içerdiği karakter sayısını verir. 
 
   Syntax : uzunluk = length (string);


 

               Karakter sayısı olarak string uzunluğu tutulur.
 
Örnek :
$string = "Bu bir stringtir";
 
$boy = length($string);


 

               içeriği 16 dır.
 

Örnek : Kelimelerin ortalama uzunluğunu bulan program.

#!/usr/local/bin/perl
$kelimesayisi = $karaktersayisi = 0;
while ($okunansatir = <STDIN>) { #satır girilir
          @kelimeler = split(/\s+/, $okunansatir); #kelimelere ayır
          foreach $kelime (@kelimeler) {
                next if ($word =~ /^\d+\.?\d+$/); #kelime bir sayımı?#öyleyse geç
                  $kelime =~ s/[,.;:]$//; #noktamala karakterlerini geç
                  $kelimesayisi += 1;
                 $karaktersayisi += length($kelime);
         }
 }
 print ("Ortalama kelime uzunluğu: ", $karaktersayisi / $kelimesayisi, "\n");
 

Çalışması,

Ben bir Türküm,Dinim cinsim uludur.
Bu memleket bizim.
Ben gelmedim dav'i icin.
^D
 
Ortalama kelime uzunluğu: 5.4
            $

 

tr  Kullanarak String Uzunluğu Bulma :
 
               tr fonksiyonu sadece hazır $_fonksiyonla birlikte karakter uzunluğu bulmada kullanılabilir.
 
Örnek : 
#!/usr/local/bin/perl
$string = "Türkiye Cumhuriyeti ilelebet payidar kalacaktır";
$_ = $string;
$uzunluk = tr/a-zA-Z /a-zA-Z /;
print ("String uzunluğu  $uzunluk  karakterdir\n");
 
Çalışması :   program.pl
String uzunluğu  45  karakterdir
Not: =~ karakterleri açıkca kullanılmadıkça string $_ kabul edilir.
tr’de onu uzunluk olarak alır.
 
Örnek : tr kullanarak özel karakter dökümü;
 
#!/usr/local/bin/perl
$noktalama = $bos = $toplam = 0;
while ($oku = <STDIN>) {
          chop ($oku);    # \n atılır
          $toplam += length($oku); #toplam karakter sayısı
          $_ = $oku;
          $noktalama += tr/,:;.-/,:;.-/; # özel karakterleri sayar
          $bos += tr/ / /;
 }
 print ("Sonuçlar:\n");
 print ("\t noktalama karakterleri: $noktalama,\n");
 print ("\t boşluk karakterleri: $bos ,\n");  
 print (" \tdiğer karakterlerin adedi ise: ");
 print ($toplam - $noktalama - $bos); # diğer karakterler bulunuyor
 print ("\n");  
Çalışması: program.pl 
 
Ben bir perl öğrencisiyim 5.5 gündür perl çalışıyor, çalışıyor ve çalışıyorum.
Neden daha önce başlamadım ?
^D
 
Sonuçlar:
         noktalama karakterleri: 3,
         boşluk karakterleri : 14,
         diğer karakterlerin adedi ise: 89
 
 
Not : Birçok fonksiyon ve operatör daha $_ değişkenini default değişken olarak kabul eder. Mesela yukarıdaki 3-6 satırlar arası şöyle yazılabilir
while (<STDIN>) { #değişken olarak $_ default sistem değişkeni kullanılıyor.
chop(); 
$toplam += length(); 
...
 
 
Pos Fonksiyonu :
 
sayi = pos(string);
pos fonksiyonu, stringteki son patern örneğinin yerini döndürür.
Burada sayi; bulunan veya atanan karakter sayısını, string ise örneği bulunan stringi temsil eder.
 
Örnek : pos kullanan örnek program
 
#!/usr/local/bin/perl
print("Kahramanmaraş stringinde a karakterinin bulunduğu pozisyon listesi aşağıdadır.\n");
$string = "Kahramanmaraş";
 while ($string =~ /a/g) {   #string içinde a arar
         $pozisyon = pos($string);
         print(" $pozisyon\t");
 }
         print("\n");
 
Çalışması : program.pl
Kahramanmaraş stringinde a karakterinin bulunduğu pozisyon listesi aşağıdadır.
 2       5       7       10      12
 
Not : pos fonksiyonuna atama yapılarak aramayı başlatacağımız pozisyonda seçilebilir.
 
pos($string) = 5;   tarama stringin 6. karakterinden başlar. 
Eğer baştan başlasın isteseydik 0 atardık.
 
substr Fonksiyonu :
 
               Bu fonksiyon bir stringden bir bölümünü ayırıp elde etmemize yarar.
 
               Syntax : substr (string, atlanacakkaraktersayısı, kopyalanacakkaraktersayısı)
               
string:  İşlem yapılacak stringtir. İfade sonucu elde edilen değerde olabilir.
atlanacakkaraktersayısı:   Kopyalama başlamadan evvel atlanacak karakter sayısı
kopyalanacakkaraktersayısı:  Kopyalanacak karakter sayısıdır. Bu dahil edilmeyebilir, bu taktirde stringin geri kalanı kopyalanır.
 
Örnek : 
#!/usr/local/bin/perl
$string = "Türkiye Cumhuriyeti 76 yaşında...Nice Yıllara...";
$parca1 = substr ($string, 8, 10);#3.den itibaren 2 tane al
$parca2 = substr ($string, 8); #stringin 10. itibaren al
print ("\$parca1 : \"$parca1\"\n\$parca2 : \"$parca2\"\n");
 
Çalışması :  program.pl
 
$parca1 : "Cumhuriyet"
$parca2 : "Cumhuriyeti 76 yaşında...Nice Yıllara..."
 
substr İle Araya String Sokma :
 
Substr, = operatörünün soluna alınır, üzerine yazma işlemi yapılır.
 
Formatı : substr (string,atlanacakkaraktersayısı,karaktersayısı)= arayasokulacakstring
 
Örnek 
#!/usr/local/bin/perl
$string = "Sevdiğim iller:Istanbul,Antalya,Bursa ve Samsun dur";
print ("$string\n");
$string = "Sevdiğim iller:Istanbul,Antalya,Bursa ve Samsun dur";
substr($string, 0, 14) = "Sevmediklerim ";
print ("$string\n");
substr($string, 0, 15) = "Sevdigim iller:";
substr($string, 41) = "Trabzon dur";
print ("$string\n");
substr($string, -1, 4) = "r...!";
print ("$string\n");
substr($string, 0, 0) = "Ertan Türkmen! ";
print ("$string\n");
 
 
Çalışması : program.pl
 
Sevdiğim iller:Istanbul,Antalya,Bursa ve Samsun dur
Sevmediklerim :Istanbul,Antalya,Bursa ve Samsun dur
Sevdigim iller:Istanbul,Antalya,Bursa ve Trabzon dur
Sevdigim iller:Istanbul,Antalya,Bursa ve Trabzon dur...!
Ertan Türkmen! Sevdigim iller:Istanbul,Antalya,Bursa ve Trabzon dur...!
 
 
study Fonksiyonu :
               Tekrarlanan değişken durumunu gösterir.
               study($deger);
 
Durum Dönüştürme Fonksiyonları :
 
lc            : (stringi) küçük harfe dönüştürür.
uc           : (stringi) büyük harfe dönüştürür.
lcfirst     : İlk karakteri küçük harfe dönüştürür.
ucfirst    : İlk karakteri büyük harfe dönüştürür.
 
Formatı;   lc(string)
               uc(string)
               lcfirst(string)
               ucfirst(string)
               
 
Örnek :
$kucuk = lc("AbcDE");         # $kucuk içeriği "abcde" ‘dir.
$buyuk = ucfirst("ertan");    # $buyuk içeriği "Ertan" ‘dır.
 
quotemeta Fonksiyonu :
 
               Stringte herhangi bir kelime olmayan karakterin önüne backslash(\) koyar.
 
Örneğin aşağıdaki satırlar aynıdır.
 
$string = quotemeta($string);
 
$string =~ s/(\W)/\\$1/g;
 
join Fonksiyonu :
 
               Elemanları tek bir stringe dönüştürür. Bununla ilgili çok örnek gördük.
 
sprintf Fonksiyonu :
 
               printf’ye benzer farkı şudur; file yazma yerine fonksiyon tarafından döndürülür.
 
               Sprintf(string, alanlarlistesi);
 
               String : basılacak karakter stringi            
               alanlarlistesi : string içine konacak değerler listesi
 
Örnek : 
#!/usr/local/bin/perl
$sayi = 26;
$yaz = sprintf("desimal: %d ,  hexadecimal: %x,  octal: %o \n", $sayi, $sayi, $sayi);
print ($yaz);$
 
Çalışması : program.pl
               desimal: 26 ,  hexadecimal: 1a,  octal: 32
 
 
 

 

chop Fonksiyonu :

 

               Skalar değerin son karakterini kaldırır. Birçok defa kullanımını gördük.

 

Formatı; chop (deger);
 
Bu arada son karakter lazım ise onu elde etmekte de kullanılır. 
$yeni=chop($eski); örneğinde $yeni içinde,$eski stringinin son karakteri vardır. Dizilerle kullanılınca da son elemanın, son karakterini tutar. 

 

Örnek :

@dizi = ("al", "ver", "at");
$son = chop(@dizi);    #  $son içinde  t  bulunur.

 

chomp Fonksiyonu :

 

String sonundaki kullanılan satır ayırıcı karakterin olup olmadığını test eder bulursa atar.

 
Örnek : 
#!/usr/local/bin/perl
$/ = "::";   #Satır ayıracını set etti.$/ sistem değişkenidir
$skalar = "Ilkdeger::";
print ("Değişkenin ilk durumu : $skalar\n");
$say = chomp($skalar);
print ("Değişkenin chomp sonrası durumu $skalar\n");
print ("Değişkenden atılan ayraç karakteri sayısı $say\n\n");
print ("Bir de dizide deneyelim\n\n");
@liste = ("test1::", "test2", "test3::");
print ("Dizideki ilk durum\n");
print ("$liste[0]\n");
print ("$liste[1]\n");
print ("$liste[2]\n");
$say = chomp(@liste); 
print ("chomp sonrası\n");
print ("$liste[0]\n");
print ("$liste[1]\n");
print ("$liste[2]\n");
 
print ("Dizi elemanlarından atılan toplam ayraç karakterleri sayısı : $say\n");
 
 Çalışması : program.pl
 
Değişkenin ilk durumu : Ilkdeger::
Değişkenin chomp sonrası durumu Ilkdeger
Değişkenden atılan ayraç karakteri sayısı 2
 
Bir de dizide deneyelim
 
Dizideki ilk durum
test1::
test2
test3::
chomp sonrası
test1
test2
test3
Dizi elemanlarından atılan toplam ayraç karakterleri sayısı:  4
 

crypt Fonksiyonu :

 

               NBS data şifreleme standardı (DES) kullanarak stringi  şifreler.

 

Formatı; sonuc = crypt (orijinal, tutulan);

 

sonuc       : Şifrelenmiş string (ilk iki karakteri tutulan da tanımlı olandır).
orijinal     : Saklanacak string.
tutulan     : 2 karakterlik string. Nasıl değiştirileceği tanımlanır.(Bu iki karakter 
                                                                       harf, rakam ve . ile / karakterlerinden olabilir.)
 
               crypt kullanarak password kontrolü yapılabilir. (UNIX login benzeri)
Bu konuya değinelim isterseniz.
Önce bir şifre girilen dosya oluşturalım.Dosya adı passwd1 olsun.İçeriğinde de
Şifremiz yani: abc./9
Şifremizi bu dosyaya yazdıktan sonra kaydedelim.
Daha sonra bunu crypt kullanarak karışık  şifre haline getirelim ve crypt ile şifrelenmiş halini
Aşağıda kodunu yazacağımız program ile ekrana yazdıralım.
Buraya kadar olan kısmı perl programı olarak şöyle kodlarız.
#!/usr/local/bin/perl
open (PAROLA, "passwd1") ||die ("dosya açılamadı");
$sifre = <PAROLA>;
chop ($sifre);
print "$sifre\n";
close (PAROLA);
$sonuc = crypt($sifre, substr($sifre, 0, 2));
print $sonuc;
print "\n";
 
Bu programı çalıştırınca karşımıza yazdığımız parola ve onun crypt ile oluşturulan son şekli gelir. 
abc./9
abZYvJc9FedlA
 
Bu şekilde abc./9 olarak yazdığımız şifrenin karışık halini elde etmiş oluruz: abZYvJc9FedlA
Işte şifre sorarken bunu kullanacağız.Ekrandan şifreyi bir yere not edelim ki daha sonra passwd isimli dosyaya kaydedeceğiz.(Bu işlemi mouse ile cut,paste(kes/yapıştır) şeklinde de gerçekleştirebiliriz.). Şifreyi passwd isimli asıl şifre kontrolu yapacağımız dosyaya
Yazıp kaydedelim ve çıkalım. passwd dosyası içeriği şimdi   abZYvJc9FedlA satırından oluşmuş 
durumdadır.Gelelim bu dosyadan şifre kontrolu yapmamızı sağlayan programın yazımına
 
Program: Daha önce yine crypt ile oluşturulan sifrenin  kontrolü yapan program
 
#!/usr/local/bin/perl
open (SIFRE, "passwd") || die ("Dosya açılamadı...");          
$sifrem = <SIFRE>;
chop ($sifrem);   
close (SIFRE);  
print ("Şifrenizi Giriniz:\n");
system ("stty -echo");
$parolam = <STDIN>;   
system ("stty echo");
chop ($parolam);
if (crypt ($parolam, substr($sifrem, 0, 2)) eq $sifrem) {
    print ("Şifre Doğru ! Giriniz !\n");
 } else {
      die ("Giremezsiniz...Program Sonlandırıldı !\n");
 }
 
Yukarda kodunu verdiğim programı çalıştıralım.
$ Program.pl
Şifrenizi Giriniz:
abc./9    (buraya girdiğiniz karakterler görünmez stty - echo komutu bu işlevi görür)
Şifre Doğru ! Giriniz !
 
Programın başarıyla çalıştığını görürsünüz.Artık geliştirmek sizin elinizde...
 

hex Fonksiyonu :

 

Hexadesimal değeri desimal sayıya çevirir.

 

   desimalsayı = hex (hexadesimal karakter stringi);

 

decnum  : decimal number

hexnum : hexadecimal karakter string

 

Örnek :

$heksadeger= "1ff";
 

$desimalsayı = hex($heksadeger);

$desimalsayı  içindeki değer : 511 ' dir.

 

int Fonksiyonu :

 

   itamsayi = int (kesirlisayi);

 

Kesirli(float-point) sayıyı.tamsayıya çevirir.

 

Örnek : 45.6 ise 45 yapar

               ifadelerle de kullanılabilir.

               $tam= int ( 68.3 / $bolen ) + 1;    gibi...

 

oct Fonksiyonu :

 

   desimalsayı = oct (octal değer);
 
hex çalışma prensibinin aynısıdır, octalden decimala çevirir.
 
ord ve chr Fonksiyonu :
 
               ord, tek karakteri ASCII nümerik değerine çevirir.
               chr, bir sayıyı ASCII değerine çevirir.
 
ord     formatı;         ascii = ord (char);
chr     formatı;         karakterdeger  =  chr (asciideger);

 

chr fonksiyonu perl5’te vardır.   Önceki versiyonlarda bu çevrim sprintf  ile yapılabilir.

$slash = sprintf (“%c”,47);  

 

Örnek program:

 

#!/usr/local/bin/perl

$deger = ord("/");

print $deger;

print "\n";

 

$deger = chr(47);

print $deger;

print "\n";

 

$deger = sprintf("%c", 47);

print $deger;

print "\n";

 

Çalışması:   program.pl

               47

               /

               /

 

scalar Fonksiyonu :

 

Bir dizinin hem dizi, hem skalar değişken anlamı içerdiğini biliyoruz. Çünkü ifadeler dizi

değişkenlerine atanır. Bu durum onun dizi anlamını gösterir. Değişken olarak anlamı ise skalar

değişken gibi atama yapılabilmesidir.

 

Perl dizinin hangi anlamda olduğuna karar verebilir işte scalar fonksiyonu dizinin skalar anlamda tanımlanmasını sağlar.

 
Formatı;   deger = scalar (liste);

 

deger         : listenin skalar anlamı

liste            : skalar durumda kullanılan liste

 

 
@dizi = ("a", "b", "c");  #dizi listesi elemanları
 
@diziboyu = scalar(@dizi);   #elemanların uzunluğundan oluşan bir liste elde edilir.            Tek elemanlı olan bu listenin içeriği 3’tür.
@diziboyu: içeriği 3’tür.
 
Scalar fonksiyonunun bir başka yararlı kullanımı <> operatörüyle birlikte kullanımıdır.
 
$tekkayıt = <DOSYAM>; örneğinde DOSYAM input file’ından bir satır okur ,
@tumkayitlar = < DOSYAM>; örneğinde ise DOSYAM’ın tümünü, @tumkayitlar içine okur.
Bu son kullanımda dosyanın sadece ilk kaydını okutmak icin aşağıdaki kodu gireriz.
@tekkayıtlıkdizi = scalar (<DOSYAM>);
 

 

pack Fonksiyonu :

 

               Bu fonksiyon bir dizi değişken listesini veya içeriğini almanızı sağlar ve onu skalar değere

dönüştürür (pack). Bu değer gerçek makine hafızasında depolu olabilir veya program dilinde kullanılmış

olabilir.

 
Formatı; sonucstring = pack(packformat, list);

 

sonucstring              : Packformatla tanımlı formatta sonuç stringidir.

packformat           : Bir veya fazla pack-format karakterinden ibarettir.

                                 Bu karakterler listenin nasıl dönüştürüleceğini kararlaştırırlar.

                                 Pack format listesi aşağıdadır.

list                         : Değerler listesi (dizi değişken içeriği olabilir)

 

 

Karakter

Açıklama

a

ASCII karakter stringi null ile

A

ASCII karakter stringi boşluk ile

b

Bit stringi (önce en düşük)

B

Bit stringi (önce en yüksek)

c

Bir işaretli karakter (-128 den 127 ye)

C

Bir işaretsiz karakter (8 bit)

d

Çift hass float point sayı

f

Tek hass float point sayı

h

Hexadecimal string, (önce en düşük rakam)

H

Hexadecimal string, (önce en yüksek rakam)

i

Bir işaretli integer

I

Bir işaretsiz integer

l

Bir işaretli uzun integer

L

Bir işaretsiz uzun integer 

n

Bir kısa integer network sırasında

N

Bir uzun integer network sırasında

p

Bir bir stringe pointer

s

Bir işaretli kısa integer

S

Bir işaretsiz kısa integer

u

Bir uuencode formata dönüştürme

v

Kısa integer VAX sırası

V

Uzun integer VAX sırası

x

bir null byte

X

Bir byte geriyi belirler

@

Null ile doldurur (ASCII 0)

 

               Pack, whitespace karakterlerine aldırmaz. Listedeki herbir eleman için bir pack format karakteri tedarik edilmelidir.

 

Basit bir pack örneği;

 

$integer = pack("i", 171);
 
Burada, 171 alınır, integer olarak formatı depolar, integer'a çevrili olarak $integer'a döner ( Bu 
diğer dosyaya yazılabilir , system veya exec ile kullanılabilir.)
Aşağıdaki örnekte;
$ikitamsayi = pack("i2", 103, 241);
pack formatı  i2 dir (i2 2 tane i yani ii anlamındadır).    Eğer birden fazla karakteri temsil eden format tanımlayacaksak,  * kullanırız.
Örneğin:  $coktamsayi = pack("i*", 14, 26, 11, 83);
Yalnız * karakterini A,a,@ gibi formatlarda kullanmamalıyız.
Mesela  a formatını kullanırsak,bu formatın her bir elemanı temsil eden format olduğunu bilmeliyiz.
 
$string = pack("a5", "test");
Bu örnekle $string içine 4 elemanlı test ve 1 tane null atanır.
 
$string1 = pack("a7", "test1", "test2");
Bu örnekte ise $string1 içine 5 elemanlı test1 ve 2 tane null atanır. test2 stringi dikkate alınmaz.Yani listenin sadece tek elemanı dikkate alınır.
 

unpack Fonksiyonu :

 

               Pack komutunun  tersidir.

 

defined Fonksiyonu :

 

Değişkenlere veya dizi elemanlarına daha önce değer atanmış olup olmadığı test edilir.

 

sonuc = defined (ifade);
 
ifade: Atama yapılan değişken.Herhangi bir  tür olabilir.

sonuc :  En azından bir elemana atama yapılmışsa true değeri alır aksi durum false -0- dır.

 

Örnek :

               #!/usr/local/bin/perl

               $dizi[2] = 7;

               $dizi[4] = "Ertan";

               for ($i = 0; $i <= 5; $i++) {

                   if (defined ($dizi[$i])) {

                        print ("Eleman ", $i+1, " : *** Atama yapıldı*** \n"); 

                    }

                 else {

                       print ("Eleman ", $i+1, " : Tanımsız\n");                

                   }

               }

 

Çalışması :   program.pl

 

Eleman 1 : Tanımsız
Eleman 2 : Tanımsız
Eleman 3 : *** Atama yapıldı*** 
Eleman 4 : Tanımsız
Eleman 5 : *** Atama yapıldı*** 
Eleman 6 : Tanımsız
 

 

undef Fonksiyonu :

 

               Bir değişkeni tanımsız yapar.

 

Örnek :

#!/usr/local/bin/perl
$dizi[2] = 7;
print ("Şu anda Eleman 2 ye atama yapıldı \n");
undef($dizi[2]);
$dizi[4] = "Ertan";
for ($i = 0; $i <= 5; $i++) {
    if (defined ($dizi[$i])) {
        print ("Eleman ", $i+1, " : *** Atama yapıldı*** \n");
      }
    else {
         print ("Eleman ", $i+1, " : Tanımsız\n");
         }
}
 

Çalışması : program.pl

 

Şu anda Eleman 2 ye atama yapıldı 
Eleman 1 : Tanımsız
Eleman 2 : Tanımsız
Eleman 3 : Tanımsız
Eleman 4 : Tanımsız
Eleman 5 : *** Atama yapıldı*** 
Eleman 6 : Tanımsız
 
 

grep Fonksiyonu :

 

               Stringin içinde pattern arar..

 

Formatı;    Bulunan_eleman_listesi = grep (aranacak_pattern ,  aranacak _iiste_elemanları);

 

 

Örnek :

@liste = ("Ad", "Ertan", "Soyad", "TURKMEN");
 
@Bulunan = grep(/^[tT]/, @liste);
 

@liste elemanları içinde t ve T aranır. Bulunan liste elemanı @Bulunan içine konulur.

 Sonuçta liste elemanları “Ertan” ve “TURKMEN”   dir.

 

Örnek : Klavyeden girilen integer(tamsayı)ları bulup,toplamını veren program

 

#!/usr/local/bin/perl
$toplam = 0;
$sayial = <STDIN>;
@kelimeler = split(/\s+/, $sayial); #bir veya fazla boşluk bulunur ve kelimelere ayrılır
@sayilar = grep(/^\d+[.,;:]?$/, @kelimeler);  #tamsayılar bulunur
foreach $sayi (@sayilar) {
$toplam += $sayi; # toplamları alınır
}
print ("Girilen tam sayıların toplamı :  $toplam.\n");
 

Çalışması :   program.pl

 

Klavyeden tamsayi olarak 5 ve 6 girdim bir de 6.5 kesirli girdim

Girilen tam sayıların toplamı :  11.

 

 

Programımızda foreach döngüsünü istersek grep ve split le birlikte tek satır halinde yazabiliriz:

Bu durumda programımızın kodu şu şekle dönerdi:

 

#!/usr/local/bin/perl

$toplam = 0;

$sayial = <STDIN>;

foreach $sayi(grep (/^\d+[.,;:]?$/, split(/\s+/, $sayial))) {

        $toplam += $sayi;

}

print ("Girilen tam sayıların toplamı :  $toplam.\n");

 
Çalişması ve sonuç ise tamamen aynıdır.
 
 
 

grep ile file test operatörünün birlikte kullanımı :

              

grep sadece pattern’le değil değişik operatörlerle ifadelerle de kullanılır.

Mesela readdir ile birlikte kullanılan bir örnek,

 

Örnek :Program ekrandan girilen kelimeyi ,tüm dizindeki dosyaların  satırlarını tarayarak

           Bulur ve listeler.

#!/usr/local/bin/perl
opendir(DIZIN, ".") || die("Dizin açılamadı"); #Bulunduğunuz dizin tanımlandı
            @dosyaliste = grep (!/^\./, grep(-r, readdir(DIZIN))); # okunabilir olan ve . ile başlamayan   
                                                                                                                          #dosyalar listeye aktarılır.
closedir(DIZIN);  #Bulunduğunuz dizin dosyası kapatıldı
foreach $dosya (@dosyaliste) { #dosya listesinden dosyalar tek tek alınıyor 
open (DOSYAM, $dosya) || die ("$file isimli dosya açılamadı"); 
        while ($oku = <DOSYAM>) {  # ve dosyalar okunuyor
               if ($oku =~ /$ARGV[0]/) { # aranan kelime  satırda bulunuyor mu?
                          Not: @ARGV argümanların listesini tutar biliyorsunuz.
                 print ("$dosya:$oku"); #kelime bulunmuşsa dosya adı ve bulunduğu satır bastırılıyor
                }
         }
            close (DOSYAM); #dosya kapatılıyor.
}
 

Çalışması : program.pl   DOSYAM

 
dosya5.pl:  unless (open(DOSYAM, ">bilgi.dat")) {
dosya5.pl:         print DOSYAM ($kayit);
denem53.pl:open (DOSYAM, $dosya) ||
denem53.pl:while ($oku = <DOSYAM>) {
denem53.pl:close (DOSYAM);
 

 

 

splice Fonksiyonu :

 

               Dizi değişkeninde depolanmış listenin düzenlenmesini sağlar.

 

Formatı;

sonuc = splice (dizi, atlanan, sayi, yeni)
 
dizi                         : dizi değişkenidir(ekleme yapılacak liste elemanlarını içeren).
atlanan                  : Ekleme öncesi atlanacak eleman sayısı.
sayi                        : Yerleştirilecek mevcut dizi eleman sayısı.
yeni                       : Ekleme yapılan liste.Bu liste dizi elemanı veya haricen tanımlı değişken olabilir.
               
Eğer sayi 0’dan büyük ise, dizi elemanları listesi splice tarafından yerleştirilir. 
 
Liste Elemanlarını Yerleştirme (eskinin yerine) replace işlemi :
 
Alt listeyi yerleştirmek için bir başka alt listeye splice kullanabilirsiniz.
 
Örnek :
@dizi = ("eski1", "eski2", "eski3", "eski4");
splice (@dizi, 1, 2, ("yeni2", "yeni3"));
 
               Bu örnekte; 1. eleman atanır. Sonraki 2. eleman yerine “yeni2” “yeni3” atanır. 
@dizi dizisinin yeni eleman listesi şu şekildedir artık: ("eski1", " yeni2", " yeni3", " eski4").
Eğer yerine konacak liste elemanı fazla ise orijanal listeyi sağa doğru iterek araya girer.
Örnek :
@dizi = ("1", "2", "3", "4");
splice (@dizi, 1, 2, ("iki", "ikibuçuk", "üç"));
@dizi dizisinin yeni eleman listesi şu şekildedir artık: ("1", " iki", "ikibuçuk", "üç","4").
 
benzer şekilde liste elemanı kısa ise (az ise) sola kaydırır.
@dizi = ("1", "2", "3", "4");
splice (@dizi, 1, 2, "bitişik");
@dizi liste elemanları ("1", "bitişik", "4") olur.
 
Not : Liste elemanı etrafına parantez koymak şart değildir. Aşağıdaki 2 örnek aynıdır.

splice (@dizi, 1, 2, ("iki", "ikibuçuk", "üç"));
splice (@dizi, 1, 2, "iki", "ikibuçuk", "üç");
 

splice ile ekleme :

 

Listenin herhangi bir yerine alt liste(dizi) ekleyebilirsiniz, bunu yapmak için

 

splice (@dizi, 5, 0, "Ertan", "Turkmen");  #eleman sayisi 0 olmalıdır.

 

               Burada @array dizisinde depolu listeye (“Ertan", "Turkmen”) Listesi eklenir.

“Ertan” 6. eleman “Turkmen” ise 7. eleman olurlar. Eğer 6. ve 7. elemanlar var ise 8 ve 9. elemanlar

 olurlar. Her bir eleman sağa iter.   Eğer en sonuna yeni eleman eklenecekse atlama değerini  –1

 seçmelisiniz.

 

splice (@dizi, -1, 0, "Ertan", "Turkmen ");   gibi...
 

 

Liste Elemanını Silme :

 
Örnek :
@son = splice (@dizi, 8, 2);
 
@dizi dizisinde 9 ve 10. elemanlar silinir.Son durum @son dizisine aktarılır.
 
Örnek Program:Klavyeden girilen satırın ,5 karakterden uzun kelimelerini silen program.
 
#!/usr/local/bin/perl
while ($satir = <STDIN>) {
  @kelimeler = split(/\s+/, $satir);
  $i = 0;
           while (defined($kelimeler[$i])) {
               if (length($kelimeler[$i]) > 5) {
                             splice(@kelimeler, $i, 1);
                     } else {
                               $i++;
                               }
            }
  $satir = join (" ", @kelimeler);
  print ("$satir\n");
}
 
Çalışması :  program.pl
 
Bu satırdaki 5 karakterden uzun kelimeleri alt satırda göremeyeceksiniz.
 
Bu 5 uzun alt
 
^D
 
 
Not :       Atlama sayısı sonrasını tamamını silmek için
Mesela;  splice (@kelimeler, 7); şeklinde bir kodlama gerekir. 7. eleman sonrası silinir eğer son eleman silinecekse –1 konur.  splice (@kelimeler, -1); son elemanı siler. 
Yukarıdaki durumların tümünde splice elemanları silinmiş olan listeyi döndürür.
 

shift Fonksiyonu :

 

eleman = shift (değişken);

 

eleman   : döndürülen eleman (eğer liste -dizi- boş ise null string)

shift       : dizi değişkeninden ilk elemanı siler ve geri kalanları kaydırır(boşlukları kapatır).

 

Örnek :
@dizi = ("1", "2", "3");
$ilkdeger = shift(@dizi);
 
Buradaki işlem şudur: Dizinin 1. elemanı “1” silinir ve $ilkdeger  içine atanır.
Dizinin son durumu ise (“2”, “3”)’tür. Eğer shift kullanımında dizi yoksa perl, sistem array değişkeni @ARGV’nin   ilk  elemanının silineceğini düşünür ve işlemi yerine getirir.
 
Mesela program.pl  isimli program komut satırından argüman girilerek çalıştırılırsa 
 
Program.pl  arg1 arg2 arg3
 
Bu argümanlar (arg1,arg2,arg3) @ARGV dizisinin elemanları olurlar. Default shift bunların ilkini siler.
 
Örnek Prg.1.: 
               #!/usr/local/bin/perl
               @dizi = <STDIN>;
               $skalar=shift(@dizi);
               print "$skalar\n";
               print "@dizi";
Çalışması,
$ program.pl
ben
sen
o
            ^D
 
               ben
 
               sen
                o
 
Örnek Prg.2.:
 
#!/usr/local/bin/perl
while (1) {
$suankiarguman = shift;
last if (!defined($suankiarguman));
print ("$suankiarguman\n");
}
 
Çalışması,
$ program.pl ben sen o
ben
sen
o
 
Her tekrarda shift, @ARGV’nin ilk elemanını alır (bu işlem sonu diğerleri başa kayar) ve başka eleman kalmayınca shift, tanımsız değer döndürür(yani defined, false tur). Bu da işlemin sona ermesidir.
 
Not : shift fonksiyonu aşağıdaki splice çağrısına eşittir.
 
               splice (@dizi, 0, 1) 
 
 

unshift Fonksiyonu :

 

               shift fonksiyonu etkisini çözmek eski haline döndürmek için unshift kullanılır.

 
Formatı;
               Sonucdizisielemansayısı = unshift ( dizi ,  eklenecekeleman-lar-);
 

Örnek :

               unshift (@dizi, "yeni");  @array dizisinin önüne “yeni” elemanını ekler.

 Diğer elemanlar sağa (veya alta diye de düşünebilirsiniz) kayarak yerleşir.

 
Not : unshift fonksiyonu atlama değeri 0, uzunluk 0 olan splice çağrımı ile eşdeğerdedir. 

unshift (@dizi, "eleman1", "eleman2");
splice (@dizi, 0, 0, "eleman1", "eleman2")

push Fonksiyonu :

 

               Biraz önce unshift’in listenin önüne -başına- eleman eklediğini gördük. Listenin sonuna eleman eklemek için push çağırılır.

 

Formatı :

push (dizi, eleman);
 

Örnek :

push (@dizi, "eklenen");

 

Not : “eklenen” listenin sonuna eklenir. Listenin sonundan kasıt, daima listede son tanımlanan

          elemandır.

 

Örnek :

@dizi = ("Bir", "Iki");
$dizi[3] = "Dört";
push (@dizi, "Beş");
 
son içerik;
 
("Bir", "Iki",  "" , "Dört", "Beş");
 

3. eleman tanımlanmamıştır null stringtir.

 

Not : Aşağıdaki splice kullanımı ile aynı sonucu verir.

 

push (@dizi, "yenieleman");
splice (@dizi, @dizi, 0, "yenieleman")

 

pop Fonksiyonu :

 

               push fonksiyonunun tersidir. Liste sonundaki elemanı siler silinen eleman döndürülür.

 

               Döneneleman=pop(dizi);

 

dizi : son elemanı silinecek dizi

 

@dizi isimli dizinin son elemanını silip $donen isimli değişkene atamak için : $donen = pop (@dizi); 

kodlaması kullanılır eğer tanımlı eleman yoksa tanımsız değer döndürülür.

 

Not : splice ile aynı anlamdaki kullanımı aşağıdaki gibidir.

$donen = pop (@dizi);
$donen = splice (@dizi, -1)

split Fonksiyonu :

 

               Karakter stringlerini bir liste elemanına dönüştürür ayırır.Daha önce çokca kullandık.

Örnek :

@liste = split (/:/, $satir);
 

eğer $satir içeriği Bu:bir:satir:dir    ise  @liste  içeriği  şöyledir:    ("Bu", "bir", "satir", "dir")  .

 

Not: Split tarafından üretilecek listenin elemanlarının maksimum sayısını tanımlayabiliriz

 

$satir = "Bu:bir:satir:dir";
 
@liste = split (/:/, $satir, 3);
 

Burada oluşturulacak eleman sayisi 3 tür. 3 eleman 'dan  başka eleman oluşturulmaz.

Bu durumda @liste içeriği şöyledir :  ("Bu ", "bir ", satir:dir").

Eğer bu şekilde bir limit kullanacaksak, bir kerede bir çok skalar değişkene atama yapabiliriz.

 

$satir = "Ertan  Turkmen  Gazi   Üniversitesi   Ankara";

 

($eleman1, $eleman2, $eleman3) = split (/\s+/, $satir, 3);

 

“Ertan”     “Turkmen”     “Gazi   Üniversitesi   Ankara”

 

sort ve reverse Fonksiyonları :

 

sort, bir listeyi alfabetik sıralar. reverse, ters sırada düzenler. Örneklerini çok gördük.

 

map Fonksiyonu :

 

Bir liste elemanını ifade içinde operand olarak döndürür.

Formatı:

tekrarlananifadelerinsonuçlistesi = map(tekrarlanacakifade , operandveyaargümanolarakkullanılacak olanlisteelemanları);

 

Örnek :

@liste = (100, 200, 300);
 

@sonuclar = map($_+1, @liste);

 
@sonuclar içeriği =(101, 201, 301); olur.
 
map’i alt yordamda kullanmak için sadece $_’ı alt yordama geçirin.
 
@sonuclar = map(&altprog($_), @liste);    ..gibi
 
Ayrıca hazır fonksiyonlarda da kullanılır.
 

Örnek :

@sonuclar = map(chr($_), @liste);
 
@sonuclar = map(chr, @liste);  # üsttekinin aynısı $_  , chr için default argümandır. 
Yukarıda, @liste içindeki elemanların ASCII karakter eşitine çevrilerek sonuç listesinin @sonuclar’a konulması işlemi gerçekleşir.
 

Örnek :

               #!/usr/local/bin/perl

               @liste = (100, 200, 300);

    print "@liste\n";

               @sonuclar = map($_+1, @liste);

               print @sonuclar;

   @dizi = ("Ben","Sen","O");

   print "\n@dizi"; 

   @dizi = map($_."X", @dizi);

   print "\n@dizi";

   @dizi = map(chr(47), @dizi);

   print "\n@dizi\n";

 

 

Çalışması : program.pl
 
100 200 300
101201301
Ben Sen O
BenX SenX OX
/ / /
 
 

wantarray Fonksiyonu :

 

               Perl’de skalar değer veya liste değerlerin üzerine hazır fonksiyon vardır mesela chop fonksiyonu tek bir stringden’de bir listenin tamamından da son karakteri atar.

 

chop($dizi);    # tek bir stringin sonunu atar
 
chop(@dizi);     # dizi elemanlarının herbir elemanının sonuncusunu atar
 
perl5 bunun gibi iki tarz üzerinden ,Altprogramlarla çalışan wantarray fonksiyonuna sahiptir.
 
Formatı ;
sonuc= wantarray();
 
sonuc, eğer altyordam bir dizi ye değer döndürüyorsa  0 olmayan -true- değerdir. Eğer bir liste değilde skalar değişkene değer döndürüyorsa  0 -false- ’dır.
 
Örnek : 
#!/usr/local/bin/perl
print ("Dizi - liste - değişkene değer döndürme kontrolu\n");
@dizi = &altprog();  #dizi için altyordam çağrılınca wantarray() true değeri döndürür
print ("Simdi skalar değişkene değer döndürme kontrolu\n");
$skalar = &altprog(); #skalar için altyordam çağrılınca wantarray() false değeri döndürür
sub altprog {
if (wantarray()) {
print ("Dogru -true-\n");
} else {
print ("Yanlış - false-\n");
}
}  
 
Çalışması : program.pl
 
Dizi - liste - değişkene değer döndürme kontrolu
Dogru -true-
Simdi skalar değişkene değer döndürme kontrolu
Yanlış - false-
 
 
Bileşik Dizi Fonksiyonları
 

keys Fonksiyonu :

 

Bir bileşik dizinin elemanlarının, indislerinin (indexlerinin ) listesini döndürür.

 

liste = keys (bileşik_dizi);

 

liste               : döndürülen indislerin listesi

bileşik_dizi      : indislerin alınacağı bileşik dizi

 

Örnek :

%dizi = ("Boy", 170, "Yas", 17);
 
@liste = keys(%dizi);

 

           @liste içeriği (“Boy”,”Yas”) dır.

 

Not : liste elemanları sıralı olmayabilir. Sıralı olmaları için sort kullanabilirler.

 

keys fonksiyonu,foreach ile çok kullanılır.

 

foreach $indis (keys (%bileşikdizi)) {
        # satırlar
}

 

values Fonksiyonu :

 

               Bir bileşik dizideki tüm değerleri içeren bir liste döndürür.

 

Formatı,

liste= values (bileşik_dizi);
 

Örnek :

%dizi = ("Boy", 170, "Yas", 17);
 
@liste = values (%dizi);

 

           @liste içeriği (“170”,”17”) dır.

 

each Fonksiyonu :

 

               Bir bileşik dizinin elemanını iki eleman olarak döndürür (indis ve değer)

 

Formatı,
indexvedegercifti = each (bileşik_dizi);
 

Örnek :

%dizi = ("Boy", 170, "Yas", 17);
 
@liste = each(%dizi);

 

@liste içeriği ilk okumada (“Boy”,”170”)  veya diğeridir ("Yas", "17").İkinci okumada da  diğeridir.

 

Neden veya kullandık ? Çünki Bileşik diziden okuma sıralı olmayabilir.(Siz sıralı yerleştirseniz

dahi kendisi indexlediğinden).Sıralama fonksiyonlarıyla bu durum düzenlenebilir.

 

delete Fonksiyonu :

 

Bir bileşik dizi elemanını siler.

 

eleman = delete (bileşikdizielemanı);

 

Örnek :

%dizi = ("Boy", 170, "Yas", 17);
$silinen_elemanın_degeri = delete ($dizi{"Boy"});
Yukardaki örnekte bileşik diziden bir key (-indis- index) silinmektedir.
Bu durumda  $silinen_elemanın_degeri değişkenindeki değer ise silinen key 'in değeridir.Yani 170 dir.Bu arada bileşik dizide sadece Yas-17 değerleri kalmıştır.
 

exists Fonksiyonu :

 

               Bir bileşik dizi elemanının mevcudiyetinin kontrolünde kullanılır.

 
Formatı,
kontroldeğeri = exists(eleman);
 
kontroldeğeri  :  0 ise mevcut değil,   non-zero ise mevcut
eleman         : varlığı test edilecek birleşik dizi elemanı
 
Örnek :
$sonuc = exists($dizi{$keydegeri});
 
($dizi{$keydegeri: mevcut ise $sonuc 'a  0 olmayan değer (1) atanır.
 
 
 

SİSTEM FONKSİYONLARI

 

getgrent Fonksiyonu :

 

               Sistemin grup dosyasından (etc/group) bir maddeyi almak için kullanılır.

 

Grup dosyasında 4 bilgi vardır :

 

1. user grup adı

2. user grup şifresi (varsa)

3. grup ID

4. gruba ait user ID listesi

 

getgrent formatı :

 

(gkullanici_grupoAdı ,  ggrup_şifresi , ggrupID, ggrup_kullanıcıları) = getgrent;

 

Her bir getgrent çağrısı dosyadan bir satır aldığı için tüm dosya döngü ile okunur.

 

Örnek :

 while ((gkullanici_grupoAdı ,  ggrup_şifresi , ggrupID, ggrup_kullanıcıları) = getgrent)
{
        # işler
}
 
dosya (etc/grup) bitince getgrent boş liste döndürür.
 
Örnek : 
#!/usr/local/bin/perl
while (($ad, $sifre, $gid, $uyeler) = getgrent) {
$dizi{$ad} = $uyeler;
}
foreach $ad (sort keys (%dizi)) {
print ("$ad grubu kullanıcıları :\n");
$uyeler = $dizi{$ad};
$id = 0;
while (1) {
last if ($uyeler eq "");
 ($id, $uyeler) =
split (/\s+/, $uyeler, 2);
printf ("  %-20s", $id);
$id++;
if ($d % 3 == 0) { 
print ("\n");
}
}
if ($id % 3 != 0) {
print ("\n");
}
}
 
Çalışması : program.pl   
 
adm grubu kullanıcıları:
  root                
  adm                 
  daemon              
bin grubu kullanıcıları:
  root                
  bin                 
  daemon              
daemon grubu kullanıcıları:
  root                
  bin                 
  daemon              
  ftpadmin            
dip grubu kullanıcıları:
disk grubu kullanıcıları:
  root                
floppy grubu kullanıcıları:
  root                
  ugur  
..
..
..
 
            

setgrent ve endgrent Fonksiyonu :

 

               setgrent, getgrent gibidir. Yalnız setgrent kullanıldığında etc/group dosyasının başına ilk

elemana gidilir.

 

               endgrend ise etc/group dosyasının bundan sonrasına bakmana gerek yok der. Grup bilgisinin memory’e depolanmasını sonlandırır.

 

Formatı ;

 

setgrent();
endgrent();
 

getgrnam Fonksiyonu :

 

               Adı verilen grup adını grup dosyasından elde etmek için kullanılır.

 

Formatı,

 

(gad, gsifre, gid, guyeler) = getgrnam (ad);

 

Örnek : 
#!/usr/local/bin/perl
print ("Kontrol edilecek grub adını giriniz:\n");
$isim = <STDIN>;
chop ($isim);
if (!(($ad, $sifre, $gid, $uyeler) = getgrnam ($isim))) {
die ("$isim adında bir grubumuz yoktur...\n");
}
print ("$isim grubu mevcuttur...\n");
 
Çalışması  : program.pl
 
Kontrol edilecek grub adını giriniz:
staff
staff grubu mevcuttur...
 
 

getgrid Fonksiyonu :

 

               Verilen grup ID’ye ait grup dosyasını arar.

Formatı,

(gad, gsifre, gid, guyeler) = getgrid (id);
 

getnetent Fonksiyonu :

 

               Makinanızın bulunduğu network’in adını, adresini, tip bilgilerini çeker.

etc/networks dosyasından (sistemin bu dosyayı kullanması durumunda) listeyi döndürür.

 

(ad, alt_ad, tip, net) = getnetent();

 

ad                          : network adı

alt_ad                    : network için alternatif adlar

tip                          : adres tipi (sistem sabiti AF_INET’den internet adresini belirler).

net                         : network in internet adresi

 

AF_INET’in yeri;

/usr/include/netdb.h  veya /usr/include/bsd/netdb.h  olabilir...

 
Örnek : 
 (($ad, $alternatif_ad, $adrestipi, $int_adresi) = getnetent()) 
 

getnetbyaddr Fonksiyonu :

 

               Sistemde mevcutsa /etc/network dosyasını okur ve istenen network numarasını bulur.

 

               (ad, alternatif_ad, adrestipi, adres) = getnetbyaddr (internet-adres, int_adres_tip);

 

internet-adres : aranacak network numara veya adresi olabilir.(Bu adres 4 byte integer olmalıdır

 (194.27.16.7 gibi ).  Bir paket adres oluşturmak için pack kullanırız.

 
Örnek :
@byteadres = (192, 75, 236, 168);
$paketadres = pack ("C4", @byteadres);
 
$paketadres, getnetbyaddr ‘a geçirilebilir durumdaki  adrestir.
 

getnetbyname Fonksiyonu :

 

Bu fonksiyon network adı ve aliasını okur.getnetbyaddr gibidir.

Farkı, /etc/network’den okurken ismi verilen network’ü tarar.

 

(ad, alternatif_ad, adrestipi, adres) = getnetbyname (taranacak_makine_adı);

 

setnetend ve endnetent Fonksiyonu :

 

               setnetend tarama için  /etc/network’ün başına (rewind)gider.

 

Formatı;

setnetent (kontrol);

 

kontrol :  skalar değerdir.Eğer 0 ise /etc/network file’ı kapalıdır, 0 dan farklı ise açıktır.

 

Endnetent ise programın bittiğini söyler (/etc/network dosyasıyla işinin bittiğini söyler ve bu dosya kapatılır).

 

Formatı,

endnetent;
 

gethostbyaddr Fonksiyonu :

 

gethostbyaddr , /etc/hosts (veya eşiti) dosyasını tarar  ve 5 elemanlı liste döndürür.

 

(ad, alternatif_ad, adrestipi, adres_uzunluğu, adres)  = gethostbyaddr (internet_adres, intAdrTipi);

 

ad                     : internet_adres ile tanımlı internet adresine uyan host name

alternatif_ad   : Host’un alias veya alternatif isimleri listesidir.

addrtype          : intAdrTipi ’ ne  benzer daima AF_INET’dir.

adrestipi          : Adreslerin bir listesidir. (ad isimli host node'a uyan Ana ve Alternatifler adlar listesi)

adres_uzunluğu : adres alanının uzunluğudur. Uzunluk daima adres içinden döndürülür.

                               (Herbir address 4 byte integer olarak depolanmıştır).

 

Bu fonksiyon 2 argüman ister.

 

1. internet_adres :Aranacak internet adresidir. Paketlemiş 4 byte formatındadır.

2. intAdrTipi  : Adres tipidir ve daima AF_INET’dir.

 Bunun değeri ise /usr/include/netdb.h veya /usr/include/sys/netdb.h da bulunur.

 

 

Örnek Program

 

#!/usr/local/bin/perl
             print ("Bir İnternet Adresi Giriniz:\n");       # 4 Bloklu IP numarası verilerek internet adresi
                                                                                                # girilir.(192.168.100.9..gibi)
$makina = <STDIN>;
$makina =~ s/^\s+|\s+$//g;
@byte = split (/\./, $makina);
$packadres = pack ("C4", @byte);       # 4 bytelık, paketlenmiş integer’a döndürme gerçekleşiyor. 
if (!(($ad, $alt_ad, $adrestip, $uzun, @liste) = gethostbyaddr ($packadres, 2))) 

                 { #gethostbyaddr  çağırılır. Bu fonksiyon /etc/hosts dosyasını tarar ve makinanın adını arar,

                          #bulamazsa sart ifadesi sonucu false’tur ve die ile program kesilir.

                           #Bu satırda ayrıca,adrestip olarak /usr/include/netdb.h içinde AF_INET değeri olarak , 2’yi kullanır.

                          # makine de bu değer değişikse, o değer yerine 2 yerleştirilir. Bu değer gethostaddr’ye atanır.

                           #Makine adı bulunursa döndürülür

       die ("$makina adresi bulunamadı.\n");
      }
print ("Makina Adı: $ad\n");  #Makine adı bastırılır
if ($alt_ad ne "") {
print ("Alternatif isimleri:\n");
@altlist = split (/\s+/, $alt_ad);
for ($i = 0; $i < @altlist; $i++) {
print ("\t\t$altlist[$i]\n"); #eğer alternatif isimler varsa ayrı ayrı satırlara yazılır.
}
}
 

Çalışması : program.pl

Bir İnternet Adresi Giriniz:

194.16.6. 1

Makina Adı: nt.cc..gazi.edu.tr

Alternatif isimleri:

               nt.cc
 

gethostbyname Fonksiyonu :

 

gethostbyaddr’ye benzer. Farkı tarama yapılan makine ismi veya internet site ismi girilerek yapılır.

 

              ($ad, $alt_ad, $adrestip, $uzun, @liste) = gethostbyaddr (makine_site_adı)

 

5 elemanlı liste döner (önceki fonksiyondaki gibi). Bunlar, makine adı, alternatif isimler listesi, adres tipi, adres listesi uzunluğu ve adres listesidir.

 

Örnek : Makine veya siteadı girildiğinde,IP numarasını veren program.

 

#!/usr/local/bin/perl
print ("Makine veya site adı giriniz:\n\t");
$makine = <STDIN>;
$makine =~ s/^\s+|\s+$//g;
if (!(($ad, $alternatif, $adrestip, $uzunluk, @adreslistesi) =
gethostbyname ($makine))) {
die ("$makine isimli makine mevcut değil.\n");
}
print ("IP adresleri:\n\t");
for ($i = 0; $i < @adreslistesi; $i++) {
@adresbytelari = unpack("C4", $adreslistesi[$i]);
$gercekadres = join (".", @adresbytelari);
print ("\t$gercekadres\n");
}
 

Çalışması : program.pl

 

Makine veya site adı giriniz:
             amasra.basbakanlik.gov.tr
IP adresleri:
                         195.155.128.6
 

gethostent, sethostent, ve endhostent Fonksiyonu :

 

gethostent;  etc/host  dosyasının her bir maddesini okuyarak döndürür.

 
($ad, $alt_ad, $adrestip, $uzun, @liste) = gethostent();
 

sethostent; /etc/hosts’ta rewind eder (başa döner).

 

Bu demektir ki bundan sonraki okuma dosyanın ilk kayıtından başlar.

 

sethostent (kontrol);
 
kontrol : Skalar değerdir. Eğer 0 ise sethostent icrası biter.
endhostent; /etc/hosts dosyasını kapatır. Memory’i boşaltır, argümansız kullanılır.
endhostent();

 

getlogin Fonksiyonu :

 

Bağlı olduğumuz kullanıcıya ait  (user_ID) ismi döndürür userID /etc/utmp den alınır.

 

loginAdi=getlogin();

 

loginAdi : döndürülen kullanıcı kimliği (adı)

 

Örnek :

#!/usr/local/bin/perl
$loginAdi = getlogin();
 if ($loginAdi == "ertan") {
         print ("Merhaba, Ertan! Hoş geldin!!!\n");
 }
 
Çalışması:  program.pl
 
Merhaba, Ertan! Hoş geldin!!!
 
 

getpgrp ve setpgrp Fonksiyonu :

 

               Bir prosesin proses grup ID’sini verir.

 

   grupadideğişkeni = getgrp (pid);
 

Örnek :

#!/usr/local/bin/perl
$pgroup = getpgrp (0);
print ("bu programın proses grubu $pgroup.\n");
 

Çalışması : program.pl

 
bu programın proses grubu 3313.
 

setpgrp ile bir proses için, proses grubu set eder

setpgrp (proses_id, group_id);
 

getppid Fonksiyonu :

              

               Herbir prosesin bir ana (parent) prosesi vardır ki onunla çalışmaya başlamıştır. Programınızın parent prosesinin ID’sini elde etmek için getppid fonksiyonunu kullanır.

 

parent = getppid();

 

 

Örnek :

#!/usr/local/bin/perl
  $id = fork();
  if ($id == 0) {
      print "child proses: $id\n";
      $id = getppid(); #parent prosesi elde et
      print "parent proses :$id\n\n";
     }
else{
     print "Parent Proses: $id\n\n";
    }
 

Çalışması,

 

Parent Proses: 27078

 

getpwnam Fonksiyonu :

 

Password dosyasına giriş temin eder (etc/passwd). 9 elemanlı liste döndürür.

 

(Kullanıcı_kimliği, kripte_edilmiş_şifre, kullanıcı_numerik_ID, KullanıcıgrupID, kota, açıklama, alanbilgileri, kullanıcıyaaitHomeDIR,çalışılankomutshell_i)  =
                                                              getpwnam (Bilgilerine_erişilecek_kullanıcı_adı);

Bulunmazsa boş liste döner.

 

Örnek :

#!/usr/local/bin/perl
print ("Kullanıcı Adı Giriniz:\n");
$isim = <STDIN>;
$isim =~ s/^\s+|\s+$//g;
if (($isim, $sifre, $id,$gr,$a2,$a3,$ac,$hm,$sh) = getpwnam ($isim))
{
print ("$isim adlı kullanıcının sahip olduğu kullanıcı ID si:$id.\n");
print ("Diğer bilgileri ise şöyledir:\n".
"Baglıoldugu_grup_id:$gr\nAçıklamaAlanıBilgileri:$ac\n
KullanıcıHomeDizini:$hm\nCaliştigi shell:$sh\n");
} else {
print ("Bu isimde kullanıcımız yok!!\n");
}

 

Çalışması,

 

Kullanıcı Adı Giriniz:

iyimser

iyimser adlı kullanıcının sahip olduğu kullanıcı ID si:   2386.

Diğer bilgileri ise şöyledir:

Baglıoldugu_grup_id:   100

AçıklamaAlanıBilgileri:   MURAT CETINKAYA,REK.BIM.VERI HAZ.

KullanıcıHomeDizini:  /home/iyimser

Caliştigi shell:  /bin/bash

 

getpwuid Fonksiyonu :

 

               Bu fonksiyonda bir önceki fonksiyon gibi password dosyası arar.

Farkı ise sayısal userid ye göre tarama yapmasıdır.

 

Formatı, getpwnam ile aynıdır.

 

getpwent Fonksiyonu :

 

Önceki iki fonksiyon 1 user için giriş işlemine izin veriyordu. Dosyadaki tüm kayıtlar için giriş

yapılacaksa bu fonksiyon kullanılır. İlk elde edilen giriş ilk /etc/passwd satırıdır (userıdır).

Her dönüşte diğerleri de elde edilir.

 

Formatı,

(Kullanıcı_kimliği, kripte_edilmiş_şifre, kullanıcı_numerik_ID, KullanıcıgrupID, kota, açıklama, alanbilgileri, kullanıcıyaaitHomeDIR,çalışılankomutshell_i)  =     getpwent();
 

Bununla tüm kullanıcılara ait bilgilere erişilip kullanılabilir.

 

Örnek :

#!/usr/local/bin/perl
while (1) {
last unless (($kullaniciadi, $sifre, $id) = getpwent());
$kullanicilar{$kullaniciadi} = $id;
}
print ("Makinedeki Kullanıcılar:\n");
foreach $kullanici (sort keys (%kullanicilar)) {
printf ("%-20s %d\n", $kullanici, $kullanicilar{$kullanici});
}
 

Çalışması :  program.pl

 

Kullanıcılar ve sayısal kimlikleri:

..

..

ytuncay              2398

yuce                 1172

yusuf                722

zaur                 1941

zcimen               2489

zcinar               1468

zdinc                2295

zehra                1242

zekiarda             1792

....

....

 

 

setpwent ve endpwent Fonksiyonu :

 

setpwent, etc/passwd dosyasında rewind (başa dönme) yapar.

setpwent (kontrol);
kontrol, 0 olamayan değerse password dosyasının tekrar erişileceği düşünülür ve memory’de tutulur 0 ise atılır. 
endpwent ise password dosyasını kapatır ve memoryden atar endpwent (); formatındadır.