GiRİŞ Perl Komutları Nasıl Yazılır?


KOMUT SATIRINDAN SEÇENEK GİRME



Yüklə 0,83 Mb.
səhifə6/7
tarix02.11.2017
ölçüsü0,83 Mb.
#26951
növüYazı
1   2   3   4   5   6   7

KOMUT SATIRINDAN SEÇENEK GİRME

Syntax : Perl seçenek program adı

Örnek :

$ perl -s -w test1 c



komutu ile test1 programı –s ve –w seçeneklerini alır ve çalışır. Bazı seçeneklerde değer alabilir. Örnek :

$ perl -0 26 test1


integer

Aradaki boşluğu (seçeneklerde) kaldırarak da aynı iş yapılır.

$ perl -026 test1 ...gibi

$ perl -sw test1 ...gibi


$ perl -sw026 test1 ...gibi

PROGRAMDA SEÇENEK TANIMLAMA

#!/usr/bin/perl -w # perl4 te tek seçeneğe izin var. Perl5 serbest

# ama bazı sistemler 32 karakterden fazlasını almıyor.

Komut satırında perl -s test1 ¿ girmişsek programın ilk satırı ise ise Program çalışırken sadece -s seçeneği ile çalışır. -w dikkate alınmaz.

SEÇENEKLER

-v : Perl'in versiyonunu verir.

$ perl -v test1 ¿

-c : syntax'ı kontrol eder.

$ perl -c test1 ¿

Program çalıştığında test1 syntax ok mesajı verir, hata varsa bildirir.

-w : Yazım ikazı, program yazımında syntax değilde yazım kullanımı konusunda hata varsa kontrol eder. Mesela yanlış değişken adı veya = = yerine eq kullanılması gibi. Örneğin ; $y=$x; satırına geldik diyelim eğer $x tanımsız ise Identifier main::x ..... şeklinde mesaj verir.(Bunlarla ilgili geniş bilgiyi sonraki bölümlerde inceleyeceğiz.)

-w ile -c kullanımı hem syntax hem kullanım hatasının tespiti için yararlıdır.

-e : Tek satır programı icrası (bir satırda birden fazla da kullanılabilir). Örneğin ;

perl -e "print('Hello');" -e "print('there');" ¿

Ekrana : Hello there yazar.

-s : Kendi komut satır seçeneklerinizi tedarik eder. Perl -s test1 -q ¿ program test1'i başlatır ve -q seçeneğini ona geçirir. Eğer -s yazmasaydık -q seçeneği programa geçmezdi. Seçenek tek karakterden fazla olabilir. $sebze değişkenini kullanacaksak

perl -s test1 -sebze ¿

gireriz. $sebze'nin değeri 1'dir. (perl otomatikman 1 verir.) veya başka bir değer atama işi şu şekilde yapılabilir.

perl -s test1 -sebze="nar" ¿

$ ebze içeriği "nar" olur.

-P option : C preprocessor kullanma seçeneğidir.

Perl -P örnekprog ¿ bu komutla örnekprog , C önişlemcisinden den alınır sonra icra için perl'e geçer. C önişlemcisi bize C deki bazı ifadelerini kullanma izni verir. # ile başlarlar.Örnek ;

# define USER "ertan"
# define EXPRES (14+6)

define tanımlı makroya değer geçirir.



# define bulunan bir perl program örneği :

Çalışması :

Bir Internet adresi giriniz:
194.27.16.7
Tam adı: sirius.gazi.edu.tr
Diger adları :

sir
sirius

Define ile ilgili bir başka kullanım :

#define FIRST 1


#define SECOND FIRST
$result = 43 + SECOND; ( yani 43+1)

#include Kullanarak Diğer Dosyaları Alma :

#include dosyaadı

include bir başka C önişlemci komutu olup, tanımlı program parçasını dosya içeriğinine dahil etme işlevi görür. Örnek ; myincfile.h dosyasını dahil etmek için

#include " incdosyam.h"

(bu dosya local dizin'de aranır. diğer dizinlerde de aratmak icin -I opsiyonu kullanılır). Verilen patern’de arama için,örneğin;

#include "/u/pub/incdosyam.h"

şeklinde kodlanır.

-I : bu seçenek C include dosyalarını aratır.-P ile birlikte kullanıldığında bu dosyaları hangi dizinde aranacağı belirtilmiş olur.

perl -P -I /u/home/incdizin dosya

birden fazla dizinde aratmak için;

perl -P -I /u/home/incdizin -I //u/home/incdizin2 dosya

-I ile verilen dizinler @INC içinde saklanır.

-n : Çoklu dosyalarla işlem seçeneğidir. Birden fazla giris (dosya/satır)okuması yapar.

Unix'te birçok dosya ile işlem mesela komut satırından yapılabilir. (örneğin;Cat dosya1 dosya2 dosya3 komutu dosya1, dosya2, dosya3 dosyalarını okur ve ekrana basar v.b) Perl’de aynı işi <> operatörü ve döngü yardımıyla yapabiliriz.

while ($line = <>) {
----
---- satırlar
----
}

Bir başka metot da –n kullanımı ile gerçekleştirilir. Bu seçenek, komut satırından birden fazla girdi alır. Konuya ilişkin bir örnek görelim : Bu örnek girilen satırın iki yanına * koyar. Örnek ;

#!/usr/bin/perl -n
# giriş satırı sistem değişkeni olan $_içinde depolanacaktır.
$line = $_;
chop ($line);
printf ("* %-52s *\n", $line);

Çalışması ;

-n seçeneği bu programı görünmez bir while döngüsüyle kapatmıştır. Komut satırından girilen değerler $_ içine depolanır. -n ile -e birlikte kullanişlıdır. Örneğin aşağıdaki komut cat komutuna eşittir.

$ perl -n -e "print $_;" dosya1 dosya2 dosya3

veya daha basit olarak perl -n -e "print" dosya1 dosya2 dosya3 her üç dosya içeriği alt alta ekrana listelenir. $_ değişkeni default değişkendir. Hatta pattern örneklerde ve yerine koymalarda operatörler $_ üzerinden default işlem yaparlar. Örnek ;

$ perl -n -e "print if /[0-9]/" dosya1 dosya2 dosya3 ¿

dosya1, dosya2 ,dosya3 'ü tarar rakam içeren girişleri (satırları) listeler.

-p : Bu seçenekte -n -e benzer farklı olarak okunan satırları basar.

$ perl -p -e ";" dosya1 dosya2 dosya3 ¿

osya1, dosya2, dosya3 içerikleri okunur ve alt alta ekrana basılır. (yukardaki örnek unix'teki Cat dosya1 dosya2 dosya3 komutuyla aynıdır.) -p seçeneği -i ile de çok kullanılır.

-p ve -n birlikte kullanılırsa, -n dikkate alınmaz.

-i : Dosya yazma (editing)seçeneğidir

Görüldüğü üzere -p ve -n seçenekleri komut satırında tanımlı dosyaları okuyordu. -i seçeneği, -p ile kullanıldığında, dosyadan okuduğunu tekrar oraya yazma amacıyla kullanım işlevini sağlar (unix'deki sed gibi dosyayı edit etme işlevi).

$ perl -p -i -e "s/fgh/xwz/g;" dosya1 dosya2 dosya3

komutu ile dosyalardaki fgh yerine xwz konulur.

-a : Satırı kelimelere ayırarak listeye (dizi)dönüştürme seçeneğidir. Bu seçenek -n veya -p ile kullanılır ve satırı otomatikman kelimelere ayırır (white space karakteri olmayan). Bu kelimeler @F sistem dizi değişkeninde saklanırlar. -a seçeneği satırda istenenleri çekip çıkarmada çok yararlıdır. Örneğin programa girişi yapılan satır Bu bir deneme kaydıdır ise @F sistem dizi değişkeninin içeriği şu şekildedir:

("Bu", "bir", "deneme", "kaydıdır")

Mesela; Okunacak dosya adı datadosya ve kayıt formu şöyle olsun.

Ad No Toplam

girilmiş kayıtlar ise,

Bertan TURK 103 474.32
ertan NAR 10 57.32
nur TABAK 1023 4700.32

-n ve -a kullanılarak dosyadan No ve Toplam alanlarını cekip çıkaran ve yazdıran bir program örneği;

#!/usr/local/bin/perl
while ($F[0] =~ /[^\d.]/) {
shift (@F);
next if (!defined($F[0]));
}
print ("$F[0] $F[1]\n");

bu programın adı prog.pl olsun

/usr/local/bin/perl -a -n prog.pl datadosya ¿
103 474.32
10 57.32
1023 4700.32

-F : (split) ayırma patterni tanımlama seçeneğidir. Kelimeleri ayırırken ayraç karakteri de koyar. -a ile birlikte kullanım için dizayn edilmiştir. Önceki programı aşağıdaki gibi çağrılmış olsun;

/usr/local/bin/perl -a -n -F:: prog.pl datadosya ¿

Bu durumda dosya okunurken kelime aralarına : : yerleştirilir.

Bertan TURK:: 103::474.32 gibi...

Normal split'de :: işaretleri // içine alınırdı. Burada bu karakterler olsada olur olmasada yani /::/ ile :: aynıdır.

-0 : (O harfi değil, Sıfır'dır)Satır sonu girişini tanımlayan seçenektir. Şu ana kadar giriş satırlarını dosyadan veya klavyeden okuyorduk sonunda \n karakteri vardı. Biz istersek sondaki bu karakteri -0 seçeneği ile kendimiz belirliyebiliriz. Bu ASCII (8 tabanlı - octal) olarak belirlenebilir. Örneğin ; Boşluk karakterinin octal değeri 040 dır.

Perl -0 040 prog.pl okunandosya ¿

Komuyuyla prog.pl programı çağrılır onun okuma yaptığı okunandosya’nın satır sonu karakteri olarak boşluk karakteri kullanılması sağlanır. Konuyu iyice anlamak için diyelim ki data.txt dosyamız var ve içeriği de şöyle: (tabiiki satır sonlarında \n -satır sonu- karakteri var)

Bu ilk satır


ikinci satır
ucuncu satır

Perl programımızın adı prog.pl ve içeriği de aşağıdaki kodlama olsun.

#!/usr/local/bin/perl -0040
while ($line = <>) {
$line =~ s/\n//g;
next if ($line eq "");
print ("$line\n");
}

Calıştırdığımızda ekran dökümü aşağıdaki gibi olacaktır.

$ prog.pl data.txt ¿
Bu
ilk
satırikinci
satırucuncu
satır
$

- l (küçük -le- harfi) :Satır sonu çıktısı tanımlama seçeneğidir. Bu seçenek size belirlenen satır sonu karakterinin print fonksiyonu ile basılmasını sağlar. 0 gibi -l de octal değerle kullanılır(ASCII karakterin değeridir). Bu opsiyon tanımlanınca perl 2 şey yapar.



  1. Eğer -p veya -n opsiyonu tanımlıysa klavyeden girilen satırdaki son karakteri kaldırır.

  2. Print fonksiyonu çağrılınca –l ile tanımlanan karakter basılır.

Örnek Program ; Bu program kelimeler arasına ascii kodu 197 .(Octal değeri 305 dir) olan karakteri basar. Program adı program.pl olsun.

#!/usr/bin/perl -l305


print ("Merhaba");
print ("Bu ikinci kelime");
print ("Bu da 3. kelime");

Çalışması : program.pl

Merhaba Bu ikinci kelime Bu da 3. kelime

-x : Bir mesajdan bir program çekip alma seçeneğidir. Örneğin bir file içeren elektronik mail mesajından programı almak gibi. -x opsiyonu tanımlıysa perl tüm satırları görmezlikten gelir taki başlık satırını görene kadar. Bunu anlaması, başta #! Karakterlerlerini görmesiyle olur. Eğer perl5 kullanıyorsak başlık satırı ayrıca perl kelimesini içermelidir. #! ve "perl" görülünce , aşağıdaki 3 şarttan biri gerçekleşinceye kadar proses devam eder.



  1. Program sonuna gelindiğinde,

  2. Ctrl+D veya Ctrl+Z karakterine gelindiğinde

  3. _ _END_ _ ifadesi içeren satıra gelindiğinde

Örnek Program ;Bir program içinde perl program çalıştıran örnek. Program adı program.pl olsun.Komut satırından -x seçeneğiyle çalıştırılacak Aşağıdaki satırların tamamı program.pl satırlarının kodlarıdır

---------------------------------------------------------------------


Bu program
bir program içinde perl programi
içerir
program başlik açiklamasina kadarki satirlari
dikkate almaz
#!/usr/local/bin/perl
print("Merhaba, Ben bir perl programiyim!\n");
__END__

yukardaki satır program sonunu ifade eder. bu satir da dikkate alinmaz..

--------------------------------------------------------------------

Çalışması :

$ /usr/bin/perl -x program.pl
Merhaba, Ben bir perl programiyim!

Diğer Seçenekler



  1. -u : core dump oluştur.

  2. -S : Program PATH environment variable'da tanımlı DIR’da.

  3. -D : Dahili debugger flag’larını ekle.

  4. -T : Yazma güvenlik opsiyonu.

  5. -d : Perl debugger kullan.

Pattern (string / kelime ) Örneği Bulma:(Pattern Matching)

Giriş

Bilhassa dosyalarda tarama yaparken çok kullanılan bu işlemin kurallarını öğreneceğiz.

Pattern nedir ? : slash (/) karakterleri arasında bulunan karakter dizisidir.

Ör: /gazi/ Bu pattern gazi kelimesini temsil eder. Pattern tarandığı bir satırda bulunduğunda uygun örnek bulunmuş olur. Biz şu ana kadar pattern bulma ile ilgili olarak @array = split(/ /, $line); benzeri örnekler gördük. Burada / / boşluk karakterini temsil ediyor ve o amaçla aranıyordu.



Pattern bulmada kullanılan operatörler:

Bir karakter stringinde pattern parçası bulmak için özel operatörler vardır. patternin varlığını test eden operatör =~ operatörüdür.Ör:

$sonuc = $degisken =~ /abc/;

Bu komutla $degisken içinde(stringte) abc patterninin bulunduğu test edilir. Sonuç $sonuç değişkenine atanır. Sonuç ise aşağıdakilerden biridir:



  1. 0 olmayan değer veya true (doğru) --- pattern stringte bulundu ise ---

  2. !~ operatorü, =~, operatörüne benzer tek farkla ki bu operatör patternin bulunmadığını (olumsuz karşılaştırma) test eder. Ör:

$sonuc = $degisken !~ /abc/;

Burada abc bulunmuşsa $sonuc değeri 0 dır.Bu tip kodlamalar özellikle şart ifadelerinde çok kullanılır. Örnek program : Program adı pat1.pl

#!/usr/local/bin/perl
print ("Icinde Lutfen kelimesi olan bir soru cümlesi giriniz:\n");
$soruyual = ;
if ($soruyual =~ /lutfen/) {
print ("Istenilen kelimeyi girdiniz.Teşekkür ederim!!\n");
} else {
print ("Istenilen kelimeyi neden girmediniz?.\n");
}

Çalışması:

>pat1.pl
Icinde Lutfen kelimesi olan bir soru cümlesi giriniz:
Lutfen kapıyı açarmısınız?
Istenilen kelimeyi girdiniz.Teşekkür ederim!

>

PATTERNLERDE ÖZEL KARAKTERLER



+ KARAKTERLERİ KULLANIMI

önündeki(sol) karakterden 1 veya fazlası anlamındadır. ör: /de+f/ patterni aşağıdakilerinden herhangi birini bulur .

def
deef
deeef
deeeeeeef

+ karakteri mumkun olduğunca önündeki karakterden 1 den fazla olanı bulur.

Ör : /ab+/ ,abbc stringini taradığında, bulduğu örnek abb dir ab değil. + kullanımı özellikle bir satırı kelimelere bölme gibi işlemlerde çok kullanışlıdır. Örneğin bir satırda kelime aralarında bir veya birden fazla boşluk varsa ve bu boşluklardan kelime ayırımı yapacaksak + karakteri kullanımı çok uygundur.

Ör : Girilen satırdaki kelimeleri sayan program yazalım. Satır girişi anında kelime aralarında 1 den fazla da boşluk bırakarak sonucu görelim. Program adı pat2.pl olsun.

#!/usr/local/bin/perl
$kelimesayisi = 0;
$satir = ;
while ($satir ne "") {
chop ($satir);
@kelimeler = split(/ +/, $satir);
$kelimesayisi += @kelimeler;
$satir = ;
}
print ("Toplam kelime sayısı: $kelimesayisi\n");

Çalışması:

>pat2.pl
Bu bir satır.
Bu başka bir satır.
Bu da son satır olsun.
^D
Toplam kelime sayısı: 12
>

[] KARAKTERİ KULLANIMI

Bu karakter bir alternatif gruptan bir karakteri tanımlamak için kullanılır. Ör: /d[aA]f/ patterni daf ve dAf örneklerini bulur. Bu kullanımda pattern içeriği daha fazla da olabilir. Ör:/a[0123456789]e/ gibi..

Bu pattern a ile başlayan,onu takip eden bir rakam ve son karakter olarak e ile sonlanan örnekleri bulur. Daha evvel öğrendiğimiz + karakterini de [] karakteri ile birlikte kullanabiliriz. Ör: /a[cC]+f/ Bu pattern a ile başlayan,son karakteri f olan ve arada da bir veya birden fazla c ve C karakterleri olan örnekleri bulur.

acf
aCf


accf
aCcf
aCcCcf

Örnek Program : Adı pat3.pl. Önceki programda boşluk ve tab karakterini de düzenleyecek bir uygulama (kelimeler arsında bir veya fazla boşluk ve tab kullanılabilir).

#!/usr/local/bin/perl
$kelimesayisi = 0;
$satir = ;
while ($satir ne "") {
chop ($satir);
@kelimeler = split(/[\t ]+/, $satir);
$kelimesayisi += @kelimeler;
$satir = ;
}
print ("Toplam kelime sayısı: $kelimesayisi\n");

Çalışması:

>pat3.pl
Bu bir satır.
Bu başka bir satır.
Bu da son satır olsun.

^D

Toplam kelime sayısı: 12



>

Bu örnekte bir öncekinden tek bir fark vardır split(/[\t ]+/, $satir); kodlaması. Bu kodlama ile $satir değişkeninde bulunan ekrandan girdiğimiz satırda eğer kelimeler arasında bir veya birden fazla boşluk veya tab varsa bunların tümünü kelime ayıraç karakteri say ve öyle değerlendir komutu vermiş oluyoruz.



* KARAKTERİ KULLANIMI

* karakteri önündeki karakterden bir veya fazla olduğunda veya hiç olmadığında geçerli örneği bulur. Örneğin, /de*f/ paterni aşağıdaki örnekleri elde eder

df (ilk karakter -d-, son karakter -f-,arada -e- yok)
def (ilk karakter -d-, son karakter -f-,arada 1 tane -e- var)
deef (ilk karakter -d-, son karakter -f-,arada 1 den fazla -e- var)
v.b...

Bu karakter,[] karakteriylede kullanılır. Ör:/[eE]*/ gibi ..Bu pattern ile boş string ve e ile E karakterleri karışımı örnekler elde edilir.



? KARAKTERİ KULLANIMI

? karakteri önündeki karakterden bir tane veya hiç olmadığında geçerli örneği bulur. Örneğin patternimiz şu ise, /de?f/ bu patternin elde edeceği örnekler, df ve def tir.Dikkat ediniz deef,uygun örnek değildir çünkü, ? karakteri 1 taneden fazla karakteri kabul etmez.



BU TİP ÖZEL KARAKTERLER İÇİN ESCAPE DİZİSİ KULLANIMI

Perlde bulunan ve işlevi olan bazı karakterler ($,^,\, ..v.b.) pattern içinde nasıl kullanılır? Görelim. Bu karakterleri kendi özellikleriyle kullanmak için pattern içinde önlerine bir \ karakteri konur veya \Q \E karakterleri arasında kullanılır. mesela /\\+/ patterni stringte tüm \ karakteri (1 veya daha fazla) örneği olup olmadığını test eder. /\$/ $ karakterini, /\Q^ab*/ patterni, ^ab* karakterlerini, /\Q^ab\E*/ patterni ise,^a ile bunu takiben b karakterini test eder.(yani ^a dan sonra b olan ve b olmayanlar(* dan dolayı-hatırlayınız- doğru örneklerdir).



HERHANGİBİR KARAKTER VE SAYI ÖRNEĞİ BULMA

/a[0123456789]c/

Bu pattern ilk karakteri a son karakteri c olan ve aralarındaki karakterde 0 ile 9 arası herhangi bir rakam olan örnekleri test eder.Bu pattern daha kısa olarak şöyle de yazılabilir;

/a[0-9]c/

aynı işlevi görürler. Örneğin a1c,a5c,a9c doğru örneklerdir. Benzer şekilde ( 0-9 kullanımı) küçük ve büyük harflerde test edilebilirler. Ör:

/[a-z][A-Z]/, /[A-Z][A-Z]/, /[a-z][a-z]/, gibi..

ve rakam ve harfler birarada da test edilebilirler. Ör:

/[0-9a-zA-Z]/ gibi..([] arasındaki karakterlerden birisi varsa geçerlidir)

Örnek program : Basit bir değişken adı sınama programı. Program adı pat4.pl olsun.

#!/usr/local/bin/perl


print ("Bir değişken adı giriniz:\n");
$degisken = ;
chop ($degisken);
if ($degisken =~ /\$[A-Za-z][_0-9a-zA-Z]*/) # skalar değişken olması için

# $ karakteri ile başlamalı,herhangi

# bir harf ve _ karakteri veya

# herhangibir harf veya rakam olmalı


{
print ("$degisken bir skalar değişkendir\n");
} elsif ($degisken =~ /@[A-Za-z][_0-9a-zA-Z]*/)# dizi değişkeni olması için

# @ karakteri ile başlamalı,herhangi


# bir harf ve _ karakteri veya
# herhangibir harf veya rakam olmalı
{
print ("$degisken bir dizi değişkenidir\n");
} elsif ($degisken =~ /[A-Za-z][_0-9a-zA-Z]*/) # dosya değişkeni olması için

# herhangi bir harf ile başlamalı,


# sonra _ karakteri veya
# herhangibir harf veya rakam olmalı
{
print ("$degisken bir dosya değişkenidir\n");
# Bu aşamada herhangibir değişken adı kuralına uymuyor demektir.
} else {
print (" $degisken değişken adı kurallarına uymuyor.\n");
}

Çalışması :

>pat4.pl
Bir değişken adı giriniz:
$soyad
$soyad bir skalar değişkendir
>

TAM ÖRNEĞİ BULMA

Yukardaki programda değişken adı olarak aşağıdakilerden

$soyad
ad$soyad
$soyad#atla

sonuçta /\$[a-zA-Z][_0-9a-zA-Z]*/ patterni $soyad'ı bulacaktır. Dolayısıyla istediğimizin tam gerçekleşmemiş olur. Çünkü doğru örnek sadece 1.si ($soyad) olmalıydı.Tam olarak $soyad'ı bulsun istersek;yani sadece bu örnekte değil genelde tam örnek bulunsun istersek;tam örnek bulma (Pattern Anchoring) karakterleri kullanırız. Bunlar;



  1. ^ veya \A, Sadece string başından bul.

  2. $ veya \Z, Sadece string sonundan bul.

  3. \b, Kelime sınırlarında(Kelimenin başı veya sonu) bul

  4. \B Kelime içinde bul.

karakterleridir.

Şimdi örneklerle daha iyi anlayacağız.



  1. /^def/ sadece stringin en baştan ilk 3 karakteri def olanı bul.

  2. /def$/ sadece stringin en sondaki 3 karakteri def olanı bul.

  3. /^def$/ sadece def stringini bul.

Şimdi önceki programa (pat4.pl) daha iyi bir değişken adı test programı yazabiliriz.

Program adı pat5.pl olsun.


#!/usr/local/bin/perl
print ("Bir değişken adı giriniz:\n");
$degisken = ;
chop ($degisken);
if ($degisken =~ /^\$[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$degisken bir skalar değişkendir\n");
} elsif ($degisken =~ /^@[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$degisken bir dizi değişkenidir\n");
} elsif ($degisken =~ /^[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$degisken bir dosya değişkenidir\n");
} else {
print ("$degisken değişken adı kurallarına uymuyor.\n");
}

Çalışması:

>pat5.pl
Bir değişken adı giriniz:
5$soyad
5$soyad değişken adı kurallarına uymuyor.

>

KELİME SINIRLARINDA (kelimenin başında veya sonunda) TAM ÖRNEK BULMA: \b

Örnek: Kelimenin başında :/\bert/ ert örneğiyle başlayan kelimeleri bulur. Örneğin ert,ertan gibi kelimeleri bulur bertan bulunmaz. Kelimenin sonunda :/ert\b/ kelimenin sonunda ert örneği olanları bulur. Örneğin ert,mert kelimeleri bulunur ertan,bertan bulunmaz. Şu örnekte ise sadece ert kelimesi bulunur. /\bdef\b/

Pekala şöyle bir soru aklımıza gelebilir. kelimemiz $ertan olsaydı ,/\bert/ patterni ile bu ert kelimesi bulunurmuydu? -Evet. Çünki Enbaştaki $ karakteri stringin değişken olduğunu belirten karakter olup dikkate alınmazdı.



KELİME İÇİNDE TAM ÖRNEK BULMA: \B

Bunu anlamak için yine örneklere bakalım. /\Btan/ patterni, bulacağı örnek mesela ertan dır. tan kelimesinde test olumsuzdur. Benzer şekilde /tan\B/ patterninde taner kelimesi aranan örneğe uyar ve /\Btan\B/ pattern ine uyan örnekler mesela utanan,dartanyan olup. tan,ertan,taner uymaz. Bu karakterler (\b,\B) bize, bir kayıt(satır)dan ,split komutunu kullanmaksızın kelime arama imkanını, sağlar.

Örnek Program : Bu kelimesini içeren satırların sayısını veren program.pat6.pl

#!/usr/local/bin/perl


$sayi = 0;
print ("Satırları Giriniz !:\n");
$satir = ;
while ($satir ne "") {
if ($satir =~ /\bBu\b/) {
$sayi += 1;
}
$satir = ;
}
print ("'Bu' kelimesi içeren satir adeti: $sayi\n");

Çalışması :

>pat6.pl
Satırları Giriniz !:
Bu birinci satır.
Bu ikinci satır.
Bu üçüncü satır.
Sondan önceki satır
Son satır.
^D
'Bu' kelimesi içeren satir adeti: 3

>

Bu örnekte bir satırda kaç adet Bu kelimesi olduğunu düşünmedik. Sadece Bu kelimesi var mı şeklinde test ettik.Bir satırda birden fazla Bu kelimesi geçiyor ve biz kaç adet Bu geçtiğini bulmak istersek şu şekilde kodlama yapabiliriz.



if ($satir =~ /\bBu\b/) {
@kelimeler_dizisi = split(/[\t ]+/, $satir);
$say = 1;
while ($say <= @kelimeler_dizisi) {
if ($kelimeler_dizisi[$say-1] eq "Bu") {
$adet += 1; # kac adet Bu olduğu burada tutulur.
}
$say++;
}
}

veya daha kısa olarak şöyle de kodlayabiliriz.

if ($satir =~ /\bBu\b/) {
@kelimeler_dizisi = split(/\bBu\b/, $satir);
$adet += @kelimeler_dizisi - 1;
}

Hatta if kullanımına hiç gerek yoktur.

@kelimeler_dizisi = split(/\bBu\b/, $satir);

$adet += @kelimeler_dizisi - 1;

kodlaması yeterlidir. Çünkü satır otomatikman aranacaktır ve varsa Bu kelimesi yeni bir kelimeyi (dolayısıyla yeni bir dizi elemanını)başlatan ayraç olacaktır. Dolayısıyla diziler 0.elemandan başladığından dizi boyutunun 1 eksiği bulunan kelime adedini verecektir.

Pattern leri bir değişken içinde saklayarak,testlerde bu değişkenleri de kullanabiliriz.

$pattern = "[\\t ]+";
@kelimeler_dizisi = split(/$pattern/, $satir); .. gibi.

Örnek Program : Program Adı pat7.pl.İki dosyamız olsun. Kullanacağımız dosyaların adları bilgi.dat ve alan.dat olup içeriği ise,

Bu ilk kayıttır.
İkinci kayit.
Dosyadaki son kayit.

şeklinde olsun. Bu dosyaların adlarını komutsatırından girip,bir string 'i(pattern) bu dosyalarda taratalım.Taranacak string "kayit" olsun. Program stringi bulduğu takdirde hangi dosyada ve hangi kayıtta (satırda) olduğunu ekrana bassın.

#!/usr/local/bin/perl
print ("Aranacak kelimeyi giriniz : ");
$aranankelime = ;
chop ($aranankelime);
$dosya_adi = $ARGV[0];
$satirno = $bulunansayisi = 0;
while ($satir = <>)
{
$satirno += 1;
if ($satir =~ /$aranankelime/)
{
print ("$dosya_adi, satir $satirno\n");
@kelimeler = split(/$aranankelime/, $satir);
$bulunansayisi += @kelimeler - 1;
}
if (eof)
{
$satirno = 0;
$dosya_adi = $ARGV[0];
}
}
if ($bulunansayisi == 0)
{
print ("String bulunamadı !!! \n");
} else
{
print ("Bulunan $aranankelime kelimesi sayısı: $bulunansayisi\n");
}

Çalışması:

>pat7.pl alan.dat bilgi.dat
Aranacak kelimeyi giriniz : kayit
alan.dat, satir 2
alan.dat, satir 3
bilgi.dat, satir 2
bilgi.dat, satir 3
Bulunan kayit kelimesi sayısı: 4
>


Yüklə 0,83 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin