“ THERE IS MORE THAN ONE WAY TO DO IT” Hazırlayan: Cemal İNANÇ
Perl, bir dil bilimci olup, NASA’da sistem yöneticisi olan Larry Wall tarafından geliştirilmiş bir programlama dilidir. Yoğun şekilde görüntü tanıma ve metin işlemede kullanılabilecek en güçlü dillerden birisidir. 1987 yılında Wall, yeni dilinin 0. sıfırıncı versiyonunu açık kaynak kod olarak yayınladı. Açık kaynak kod camiasının desteğini giderek kazanan Perl, bir çok uygulamada kullanım bulmaya başladı. Daha çok kullanıcıyı etkilemek için Perl 3 “GNU General Public License” ile Perl4 “Artistic License” ile uyarlanmıştır. Perl 5 ise diğer dillerdeki kısıtlamaları düzelterek daha güçlü, daha okunabilir, ve daha daha esnek bir dil haline getirilmiştir.
Perl 6, Perl5 te var olan iki ana problemi giderilmesi ile sunulmuştur. Bunlar: Karmaşık iç yapısı Eskiye bağlılık Aynı zamanda Perl6 threading, signal handling, UNİCODE karakter desteği ile daha esnek ve güçlü bir dil haline gelmiştir. Larry Wall geliştirilmiş olduğu bu dili şu sözlerle ifade etmiştir: “Should make easy thing stay easy, hard things easier, and imposibble things hard”
Perl dilinin sloganı ise: “There is more than one way to do it”
Görüntü tanıma ve metin işlemede üstünlük. Nesneye dayalı tasarım için uygunluk Daha az kod daha fazla iş. Genellikle yorumlanan bir dildir. Ancak hem derleyici(perlcc) hem yorumlayıcı ile kullanılabilir. Dil tasarımı güzel yerine pratik olarak yapılmıştır. Özçağrı derinliğinde sınır yoktur. Performası bozmamak için hash tabloları gerektiği kadar büyütülebilir.
C, sed, awk, sh ve birçok başka dilin önemli ve güçlü özelliklerini bünyesinde barındırmıştır. Görüntü tanıma ve metin işlemede oldukça güçlüdür. Açık kaynak kodlu olup hemen hemen tüm sistemlerde çalışmaktadır. İfadelerin söz dizimleri c diline benzemektedir. Setuid programları, veri akışı izleme mekanizması ile c diline göre daha fazla güvenlik sağlamaktadır.
Diğer dillere göre daha karmaşık bir dil yapısı vardır. Günümüzde bağlamsal ifadelere sahip belkide tek populer programlama dilidir. Dosyalar öncelikle Perl bayt koduna derlenir. en iyi duruma getirilir ve daha sonra çalıştırılır. Yorum satırları # işareti ile başlar
Diğer dillerin aksine, değişkenleri kullanmadan önce tanımlama zorunluluğu yoktur. Kullanmak istediğiniz yerde tanımlayarak program içinde kullanabilirsiniz. Skaler değişkenler ve değerler: “Scalar” kelimesi bilimsel ve matematiksel içerikler için kullanıldığında, daha küçük parçalara bölünemeyen bileşenler olarak düşünülür. Scalar değerler ise en basit yapı blokları olarak düşünülür. Genel olarak sayılar(numbers) ve string olarak sınıflandırılır
Scalar değişkenler için hangi veri tipine bağli oldukları belirtilmelidir. Değişkenler sayı veya string cinsinden veri içerebilir. Aynı değişkenlerin değişik satırlarda sayı veya string içermesi mümkündür. Örnek: $var=1224; print $var; $var="Mehmet"; print $var;
Bir değişkeni standart input’a bağlarmak için $number=
İf yapısı: C dilindeki if yapısı ile aynı şekildedir. Unless yapısı: İf yapısının tam tersi özelliğe sahiptir. unless ($sales <= 50) do something Elsif yapısı: c dilindeki else if ile eş değerdir.
While yapısı: C dili ile aynı yapıya sahiptir Until yapısı: While yapısının karşıt anlamlısıdır. Şart koşulu yanlış yanlış iken devam eder. Örnek: $counter =10; do{ print “$counter”; } until(--$counter==0) EKRAN GORUNTUSU:
for yapısı: C dilindeki ile aynı yapıda olup ekstra özelllikleri de vardır. Foreach yapısı: Bir liste üzerindeki tüm elemenlar üzerinde dolaşmayı sağlar. 1den 10 a kadar sayıları tutan dizi foreach değişkeni $number **=2;#** operatoru karesini alır ve kontrol elamanının # oldugu indexteki değeri değiştirir
Perl dilinin bir takım fonksiyonları sağladığı bir takım özel değişkenler vardır. $_ değişkeni perl dilinin bir çok fonksiyonu için varsayılan(default) bir argumandır. Bu şekilde $_ özel değişkeni: Fonksiyon çağırmalarında kayıp parametreler yerine Foreach yapısındaki gibi kontrol değişkenleri yerine kullanılabilir. Örneğin: foreach(list) Statements; İfadesinde anlık değişken $_ değişkeninde tutulur.
foreach (‘amanda’, ‘jeff’) Print “$_”; Program sıra ile amanda ve jeff’i ekrana yazar. Next komutu: c dilinde ki continue komutu ile aynıdır. last komutu: c dilindeki break komutu ile aynıdır. and, or, not mantıksal operatorleri: &&, || ve ! Operatorleriden tek farkı daha düşük önceliği olmasıdır.
redo yapısı: genellikle kontrol amaçlı olarak and, or gibi ifadelerle kullanılır. Sıfıra bölmeyi önlemek için kullanıabilir. Örneğin: …. print “enter denominator:”; Chomp($denominator= ); $deneminator!=0 or Print “cannot divide by zero\n” and redo Die komutu: programi sonlandirir.
Perl dilinde list bir veri tipidir. Ve değerlerin oluşturduğu bir tiptir. List oluşturuken () kullanılır: (“dog”, “cat”, “horse”); Listler Perl dilinde dizilierin ilklendirilmesinde kullanılabilir.
Perl de dizileri ifade işareti kullanılır. Örneğin bir c dizisi için: c isimli bir diziyi ifade etmektedir. Dizinin belirli bir elemanını ifade ederken ise [] operatoru kullanılır. Ancak dizinini isminin işareti yerine $ kullanılır. çünkü dizinin herhangi bir elemanı scalar durumdadır. $c[1] c dizisinin ilk elemanını ifade eder
Perl dilinde dizi yaratmanın bir çok yolu vardır. Bunlardan çok kullanılan bir yol olarak list ataması ile oluşturma örnek verilebilir. (“hello”, 2283, “there”, 16.56); Yukarıda listeki 4 elemanı içeren bir dizi oluşturulmuştur. Bir ilginç özellik ise $array[-1] dizinin son elemanını verir $array [-4] sondan 4. elemanı veriir
Perl dilinde kullanıcının tanımladığı fonksiyonlar “subroutine” adı verilmektedir. Genel olarak; Perl tarafından tanımlananlara fonksiyon Kullanıcı tarafından tanımlananlara subroutine adı verilir. Tanımlama: Perl de bir subroutine tanımlarken kullanılması gereken anahtar kelime sub baş kısma yazılmalıdır. sub subroutine1 { …….. }
Kullanıcı tanımlamış olduğu fonksiyonlara parametre göndermek isteyebilir. Gönderilen bu argumanlar özel bir dizi değişkeni olan “ içerisinde tutulur. Gönderilen bu elemanlara erişmek için ; “$_[$i] dizisinin elemanlarına erirşir.
displayArguments(“Sam”, “Jones”, 2, 15, 73.2); sub displayArguments { print “All arguments for( $i=0; $i ++$i) { print “Argument $i: $_[ $i ]\n”; } }
Perl dilinde fonksiyonlardan değer döndürmek için diğer dillerdeki gibi return kelimesi kullanılır. Örnek Print subroutine($_),” ”; Sub subroutine { … return something; }
Üç tip scope kuralı içermektedir. Global scope Lexical scope Dynamic scope Global Scope: Global scope kapsamındaki değişkenler programın her yerinden erişilebilir ve kullanılabilir. C dilindeki global scope ile aynıdır. “our ” bu scope kavramında değişken tanımlamak için kullanılır.
Lexical Scope: Değişken tanımlandığı scope içerisinden erişilebililir. “my” bu scope kavramında bir değişken tanımlarken kullanılır Dynamic Scope: Tanımlandığı zamandan itibaren var olan blok içerisinde geçerlidir. Lexical scope ‘tan farkı aynı blok içerisinden diğer ir blokta olsa bile çağrılabilir. “local” bu scope kavranmını belirlemek için kullanılır.
#global değişkenler tanımlanmadan Subroutine1(); #global değişkenlerin tanımı our $x=7; our $y=17; #global değişkenlerin yazdırılması ve subroutine1’in çağırılması Print “\nglobal \$x: $x”; Subroutine1();
sub subroutine1 { my $x=10;#lexical scope Local $y=5;#dynamic scope Print “\lexical to subroutine1 $x : $x”; print “dynamic to subroutine1\$y: $y”; subroutine2(); } sub subroutine2 { print “global \$x $x”; print “dynamic to subroutine 1\$y $y”; }
KODDA DIKKAT ÇEKEN ŞEY NEDIR?
PERL dilinde main adı verilen bir fonksiyon yoktur.
Perl programlama dili nesneye dayalı tasarıma izin veren bil dil olup yeni sınıflar yazabilir, türetilerbilir. Perl programlama dilinde tüm objeler referanstır. Multiple inheritence perl dilinde var olan kavramdır. Private, public gibi kavramlar yoktur.
package Date; use strict; use warnings; # date sınıfı için constructor Sub new { #deiğişkenleri default string değerlerine set ediyor my $date = ($the_year=>1000, the_moth=>1, the_day=>1,); bless($date); return $date; } # sınıf the_day, the_month, the_year değişkenlerini hash ile tutuyor.
sub year { my $self = shift(); $self->{the_year}=shift() if return $self->(the_year); } sub month { my $self=shift(); $self->{the_day} =shift() Return $self->{the_month}; }
sub day { …… } sub setDay { { my $self =shift(); $self->month($_[0]); $self->day($_[1]); $self->year($_[2]); } else Print (“reuires tthree argument”); }
sub print { my $self =shift(); print($self->month); print (“/”); print($self->day); print($self->year); } return 1
use Date; use strict; use warnings; my $today =new Date; $today->setDate(7,14,2000); print($today->month()); today->print();
Inheritence perl dilinde özel bir array ile yapılmaktadır. = (“base class name”); Somut bir örnek verecek olursak; Employee isimli bir sınıfımız olsun ve bu sınıftan Hourly isimli bir sınıf türelmek isteyelim. = (“Employee”); Söz dizimi ile employee sınıfından hourly sınıfını türetmiş oluruz
package Hourly; … = (Employee); sub new { my $object =shift(); my $class=ref($object) || $object; My $self= $class->SUPER::new(); $self->(rate)=undef; bless($self, $class); return $self; }
C++, java gibi dillerde var olan private, public kavramları perl dilinde yoktur. Perl bu konuda kullanıcılarına güvenmeyi tercih etmiştir ve sadece arayüz ile çalışacalarını düşünmüştür. Aksi taktride ise ne yaptıklarını bildiklerini varsayarak sınırlama yapmamıştır. Perl bu konuda kullanıcılarına güvenmesine rağmen verileri gizlemek için bir takım alternatif yollar sunmuştur. Closure methodu
TEŞEKKURLER SORULAR??
Deithel & Deithel Perl How to Program E-bergi bilgisayar topluluğu elektronik dergisi : %C3%B6zellikleri,3215..html