Perl dil yapısı - Perl language structure

Yapısı Perl programlama dili dilinin sözdizimi kuralları ve programlar organize edildiği genel yollar hem de kapsar. Perl'in tasarım felsefesi, yaygın olarak atıfta bulunulan " bunu yapmanın birden fazla yolu vardır " sloganıyla ifade edilir . Bir itibariyle çok paradigma , dinamik yazılan dil, Perl programı tasarımında esneklik büyük ölçüde kontrol sağlar. Perl ayrıca modülerleşmeyi teşvik eder; bu, Unix köklerinin bileşen tabanlı tasarım yapısına atfedilmiştir ve 100.000'den fazla modülden oluşan topluluk tarafından tutulan bir depo olan CPAN arşivinin boyutundan sorumludur .

Temel sözdizimi

Perl'de minimal Hello World programı şu şekilde yazılabilir:

print "Hello, World!\n"

Bu yazdırır dize , Merhaba Dünya! ve yorumlaması önceki kaçış karakteriyle (ters eğik çizgi) değiştirilen bir karakter tarafından sembolik olarak ifade edilen bir satırsonu satırı . 5.10 sürümünden bu yana, yeni 'say' yerleşik, aynı etkiyi daha da basit bir şekilde üretir: n

say "Hello, World!"

Tüm bir Perl programı, Perl'e bir komut satırı parametresi olarak da belirtilebilir, böylece aynı program komut satırından da çalıştırılabilir (örnek Unix için gösterilmiştir):

$ perl -e 'print "Hello, World!\n"'

Programın standart biçimi biraz daha ayrıntılıdır:

#!/usr/bin/perl
print "Hello, World!\n";

Karma işareti karakteri bir tanıtır yorumunu kod satırının sonuna kadar çalışır ve (Windows hariç) derleyici tarafından göz ardı edilir Perl,. Burada kullanılan yorum özel bir türdendir: buna shebang satırı denir . Bu, Unix benzeri işletim sistemlerine Perl yorumlayıcısını bulmalarını söyleyerek programı açıkça belirtmeden çalıştırmayı mümkün kılar perl . ( Microsoft Windows sistemlerinde, Perl programlarının tipik olarak .pl uzantı Perl yorumlayıcısıyla ilişkilendirilerek çağrıldığını unutmayın . Bu tür durumlarla başa çıkmak için perl , shebang satırını algılar ve anahtarlar için ayrıştırır.)

Kanonik formdaki ikinci satır, Perl'deki ifadeleri ayırmak için kullanılan bir noktalı virgül içerir. Bir blok veya dosyada yalnızca tek bir ifade ile, bir ayırıcı gereksizdir, bu nedenle programın minimal formundan veya daha genel olarak herhangi bir blok veya dosyadaki son ifadeden çıkarılabilir. Kanonik form bunu içerir, çünkü bunu yapmak gereksiz olsa bile her ifadeyi sonlandırmak yaygındır, çünkü bu, düzenlemeyi kolaylaştırır: kod, bir bloğun veya dosyanın sonuna eklenebilir veya bir bloğun veya dosyanın sonuna, buna gerek kalmadan eklenebilir veya buradan uzaklaştırılabilir. noktalı virgül ayarlayın.

Perl Sürüm 5.10 say , çıktısına örtük olarak bir satırsonu karakteri ekleyen ve minimal "Merhaba Dünya" programını daha da kısaltan bir işlev sunar:

use 5.010; # must be present to import the new 5.10 functions, notice that it is 5.010 not 5.10
say 'Hello, World!'

Veri tipleri

Perl'de bir dizi temel veri türü vardır . En yaygın kullanılan ve tartışılanlar skalarlar , diziler , karmalar , dosya tanıtıcıları ve alt yordamlardır :

Tür mühür Misal Açıklama
Skaler $ $ foo Tek bir değer; bir sayı, dizge , dosya tanıtıcısı veya başvuru olabilir .
Dizi @ @foo Sıralı bir skaler koleksiyonu.
Hash % % foo Dizelerden skalerlere bir harita; dizeler anahtar olarak adlandırılır ve skalarlar değerler olarak adlandırılır . İlişkilendirilebilir dizi olarak da bilinir .
Dosya tanıtıcısı Yok $ foo veya FOO Açık bir dosyanın opak bir temsili veya okuma, yazma veya her ikisi için başka bir hedef.
Altyordam & & foo Bağımsız değişkenler iletilebilen, çalıştırılabilen ve veri döndüren bir kod parçası.
Typeglob * * foo Simge tablosu adı 'foo' ile her türlü girişi.

Skaler değerler

Dize değerleri (değişmez değerler) tırnak içine alınmalıdır. Bir dizeyi çift tırnak içine almak, dizede adları görünen değişkenlerin değerlerinin dizedeki değişken adını otomatik olarak değiştirmesine (veya enterpolasyon yapılmasına ) izin verir. Bir dizeyi tek tırnak içine almak değişken enterpolasyonu önler.

Örneğin, eğer $name olduğunu "Jim" :

  • sonra print("My name is $name") yazdıracak "My name is Jim" (çift tırnak içinde enterpolasyon),
  • ancak print('My name is $name') yazdıracaktır "My name is $name" (tek tırnak içinde enterpolasyon yapılmaz).

Bir dizeye çift tırnak işareti eklemek için, önüne ters eğik çizgi koyun veya dizeyi tek tırnak içine alın. Tek bir tırnak işareti eklemek için önüne ters eğik çizgi koyun veya dizeyi çift tırnak içine alın.

Dizeler ayrıca q ve qq alıntı benzeri işleçlerle de alıntılanabilir :

  • 'this' ve q(this) aynı
  • "$this" ve qq($this) aynıdır.

Son olarak, çok satırlı dizeler buradaki belgeler kullanılarak tanımlanabilir :

$multilined_string = <<EOF;
This is my multilined string
note that I am terminating it with the word "EOF".
EOF

Sayılar (sayısal sabitler) tırnak gerektirmez. Perl, kullanıldıkları bağlama bağlı olarak sayıları dizelere ve tam tersi şekilde dönüştürür. Dizeler sayılara dönüştürüldüğünde, dizelerin sondaki sayısal olmayan kısımları atılır. Bir dizenin başındaki hiçbir parçası sayısal değilse, dize 0 sayısına dönüştürülür. Aşağıdaki örnekte, dizeler $n ve $m sayılar olarak kabul edilir. Bu kod, '5' sayısını yazdırır. Değişkenlerin değerleri aynı kalır. Perl'de + her zaman sayısal toplama operatörü olduğuna dikkat edin. Dize birleştirme operatörü, noktadır.

$n = '3 apples';
$m = '2 oranges';
print $n + $m;

Kesirli değerlerin tamsayı değerlerine yuvarlanması için işlevler sağlanmıştır : int kesirli bölümü keser, sıfıra yuvarlar; POSIX::ceil ve POSIX::floor sırasıyla her zaman yukarı ve her zaman aşağı yuvarlayın. Sayıdan dizgeye dönüştürme printf "%f" veya yuvarlamasprintf "%f" , bankacıların yuvarlamasını kullanır .

Perl ayrıca koşullu ifadeleri değerlendirirken kullandığı bir mantıksal bağlama sahiptir. Aşağıdaki değerlerin tümü Perl'de yanlış olarak değerlendirilir:

$false = 0; # the number zero
$false = 0.0; # the number zero as a float
$false = 0b0; # the number zero in binary
$false = 0x0; # the number zero in hexadecimal
$false = '0'; # the string zero
$false = ""; # the empty string
$false = (); # the empty list
$false = undef; # the return value from undef
$false = 2-3+1 # computes to 0 that is converted to "0" so it is false

Diğer tüm (sıfır olmayan değerlendirilen) değerler doğru olarak değerlendirilir. Bu, gerçekte bir sayı olarak 0 olan, ancak boole olarak kullanıldığında doğru olan "0 ama doğru" ifadesinin kendi kendini tanımlayan tekdüze dizgesini içerir. Sayısal olmayan tüm dizeler de bu özelliğe sahiptir, ancak bu belirli dizge, sayısal bir uyarı olmaksızın Perl tarafından kesilir. Bu dizenin daha az açık, ancak kavramsal olarak daha taşınabilir bir versiyonu, '0E0' veya '0e0'dır ve karakterlerin 0 olarak değerlendirilmesine dayanmaz, çünkü' 0E0 'kelimenin tam anlamıyla sıfır çarpı on üssüdür. Boş karma {} da doğrudur; bu bağlamda {} boş bir blok değildir, çünkü perl -e 'print ref {}' döner HASH .

Değerlendirilmiş boole ifadeleri de skaler değerlerdir. Belgeler, hangi belirli doğru veya yanlış değerinin döndürüleceğine dair söz vermez . Çoğu boole operatörü, true için 1 ve false için boş dize döndürür. Tanımlanmış () işlevi, bir değişken herhangi bir değer setine sahip olup olmadığını tespit eder. Yukarıdaki örneklerde, tanımlı ($ false) , undef dışındaki her değer için doğrudur .

Özellikle 1 veya 0'a ihtiyaç duyulursa, koşullu operatör kullanılarak açık bir dönüştürme yapılabilir :

my $real_result = $boolean_result ? 1 : 0;

Dizi değerleri

Bir dizi değeri (veya liste), öğelerinin virgülle ayrılmış, parantez içinde (en azından operatör önceliğinin gerektirdiği yerlerde) listelenmesiyle belirtilir.

@scores = (32, 45, 16, 5);

Qw () quote-like operatörü, tırnak ve virgül yazmadan bir dizge listesinin tanımlanmasına izin verir. Parantez yerine neredeyse tüm sınırlayıcılar kullanılabilir. Aşağıdaki satırlar eşdeğerdir:

@names = ('Billy', 'Joe', 'Jim-Bob');
@names = qw(Billy Joe Jim-Bob);

Split işlevi, bir sınırlayıcı dize veya normal ifade kullanılarak bir dize ifadesinden bölünen bir dizeler listesi döndürür.

@scores = split(',', '32,45,16,5');

Bir listenin tek tek öğelerine, köşeli parantez içinde sayısal bir indeks sağlanarak erişilir. Skaler mührü kullanılmalıdır. Alt listeler (dizi dilimleri), parantez içindeki sayısal indislerin bir aralığı veya listesi kullanılarak da belirtilebilir. Bu durumda dizi işareti kullanılır. Örneğin, $month[3] is "April" (dizideki ilk öğenin dizin değeri 0'dır) ve @month[4..6] is ("May", "June", "July") .

Hash değerleri

Perl programcıları, bir anahtar / değer çiftleri listesinden bir hash (veya ilişkili diziyi ) başlatabilir. Anahtarlar değerlerden virgül yerine => operatörle (bazen kalın virgül olarak adlandırılır ) ayrılırsa, tırnaksız olabilirler (barewords). Aşağıdaki satırlar eşdeğerdir:

%favorite = ('joe', "red", 'sam', "blue");
%favorite = (joe => 'red', sam => 'blue');

Bir karmadaki bireysel değerlere, kaşlı ayraçlar içinde karşılık gelen anahtar sağlanarak erişilebilir. $ Desen bir sayısal olarak erişilen elemanını tanımlar. Örneğin, $ favori {joe} "kırmızı" ya eşittir. Bir hash, değerleri ayrı ayrı ayarlanarak da başlatılabilir:

$favorite{joe}   = 'red';
$favorite{sam}   = 'blue';
$favorite{oscar} = 'green';

@ Bunun yerine işaret kullanılarak birden çok öğeye erişilebilir (sonucu bir liste olarak tanımlayarak). Örneğin, @favorite {'joe', 'sam'} şuna eşittir ('red', 'blue').

Dosya tanıtıcıları

Dosya tanıtıcıları, kaynaklara okuma ve yazma erişimi sağlar. Bunlar çoğunlukla diskteki dosyalardır, ancak aynı zamanda bir aygıt, bir kanal veya hatta bir skaler değer de olabilir.

Başlangıçta, dosya tanıtıcıları yalnızca paket değişkenleri ile, onu diğer değişkenlerden ayırmak için ALL_CAPS kuralı kullanılarak oluşturulabilirdi. Perl 5.6 ve daha yenisi ayrıca , adlandırılmış bir dosya tanıtıcısı yerine anonim bir dosya tanıtıcısına bir referansa ayarlanacak ( otomatik olarak canlandırılacak ) bir skaler değişkeni kabul eder .

Typeglob değerleri

Typeglob değeri bir sembol tablosu girdisidir. Typeglob'ların ana kullanımı, sembol tablosu takma adları oluşturmaktır. Örneğin:

*PI = \3.141592653; # creating constant scalar $PI
*this = *that; # creating aliases for all data types 'this' to all data types 'that'

Dizi işlevleri

Bir dizideki elemanların sayısı, dizi skaler bağlamda değerlendirilerek veya $# sigil yardımıyla belirlenebilir . İkincisi, öğelerin sayısını değil dizideki son öğenin dizinini verir. Skaler (@array) ve ($ # dizi + 1) ifadeleri eşdeğerdir.

Hash fonksiyonları

Tüm karmalar üzerinde çalışan birkaç işlev vardır. Tuşları işlev karma alır ve onun tuşlarının listesini döndürür. Benzer şekilde, değerler işlevi bir karmanın değerlerini döndürür. Anahtarların ve değerlerin tutarlı ancak keyfi bir sırada döndürüldüğünü unutmayın.

# Every call to each returns the next key/value pair.
# All values will be eventually returned, but their order
# cannot be predicted.
while (($name, $address) = each %addressbook) {
    print "$name lives at $address\n";
}

# Similar to the above, but sorted alphabetically
foreach my $next_name (sort keys %addressbook) {
    print "$next_name lives at $addressbook{$next_name}\n";
}

Kontrol Yapıları

Perl birkaç çeşit kontrol yapısına sahiptir.

C, JavaScript ve Java programlama dillerindekine benzer blok odaklı kontrol yapılarına sahiptir . Koşullar parantezlerle çevrilidir ve kontrollü bloklar parantezlerle çevrilidir:

label while ( cond ) { … }
label while ( cond ) { … } continue { … }
label for ( init-expr ; cond-expr ; incr-expr ) { … }
label foreach var ( list ) { … }
label foreach var ( list ) { … } continue { … }
if ( cond ) { … }
if ( cond ) { … } else { … }
if ( cond ) { … } elsif ( cond ) { … } else { … }

Yalnızca tek bir ifadenin kontrol edildiği durumlarda, ifade değiştiriciler daha kısa bir sözdizimi sağlar:

statement if cond ;
statement unless cond ;
statement while cond ;
statement until cond ;
statement foreach list ;

Kısa devre mantıksal operatörler genellikle ifade düzeyinde kontrol akışını etkilemek için kullanılır:

expr and expr
expr && expr
expr or expr
expr || expr

("Ve" ve "veya" operatörleri && ve || 'ye benzer, ancak daha düşük önceliğe sahiptir , bu da tüm ifadeleri kontrol etmek için onları kullanmayı kolaylaştırır.)

Akış denetimi anahtar sözcükleri next (C'lere karşılık gelir continue ) last (C'lere karşılık gelir break ) return ve redo ifadelerdir, bu nedenle kısa devre operatörleri ile kullanılabilirler.

Perl ayrıca, her biri iki biçime sahip iki örtük döngü yapısına sahiptir:

results = grep { … } list
results = grep expr, list
results = map { … } list
results = map expr, list

grep kontrol edilen bloğun veya ifadenin doğru olarak değerlendirildiği tüm liste öğelerini döndürür . listeninmap her bir öğesi için kontrollü bloğu veya ifadeyi değerlendirir ve elde edilen değerlerin bir listesini döndürür. Bu yapılar basit bir işlevsel programlama stilini mümkün kılar.

5.10.0 sürümüne kadar, Perl 5'te switch deyimi yoktu . 5.10.0'dan itibaren, given / adında çok yollu bir dallanma deyimi when mevcuttur ve aşağıdaki biçimi alır:

use v5.10; # must be present to import the new 5.10 functions
given ( expr ) { when ( cond ) { … } default { … } }

Sözdizimsel olarak, bu yapı diğer dillerde bulunan ifadeleri değiştirmeye benzer şekilde davranır , ancak birkaç önemli farklılık vardır. En büyüğü, açık bir şekilde tanımlanmış kesme komutlarını beklemek yerine, verilen / ilk başarılı daldan sonra ifadelerin yürütmeyi durdurduğu anahtar / durum yapılarının aksine. Tersine, continue anahtar davranışını taklit etmek için bunun yerine açık s gereklidir.

Perl 5.10 kullanmayanlar için Perl dokümantasyonu, diğer kontrol yapılarını kullanarak aynı etkiyi elde etmenin yarım düzine yolunu açıklar. Ayrıca, kardeş dil Raku'ya göre modellenen işlevsellik sağlayan bir Anahtar modülü de vardır . Bir kaynak filtresi kullanılarak uygulanır , bu nedenle kullanımı gayri resmi olarak tavsiye edilmez.

Perl bir goto label ifade içerir , ancak nadiren kullanılır. Bir Durumlar goto çünkü akış kontrolü seçeneklerinin onun genişliğini, diğer diller Perl gibi sık ortaya çıkmasa içinde çağrılır.

Kuyruk çağrısıgoto &sub yapan bir ifade de vardır . Geçerli alt programı sonlandırır ve hemen belirtileni çağırır . Bu, arayanın Perl'in kendisinden daha verimli yığın yönetimi gerçekleştirebildiği durumlarda kullanılır (tipik olarak mevcut yığında değişiklik gerekmediğinden) ve derin özyinelemede, kuyruk arama, performans üzerinde önemli olumlu etkiye sahip olabilir, çünkü dönüşte kapsam / yığın yönetimi ek yükü. sub

Altyordamlar

Alt rutinler sub anahtar sözcük ile tanımlanır ve sadece isimlendirilerek çağrılır. Söz konusu alt rutin henüz bildirilmemişse, çağırma işlev adından sonra parantez veya ondan önce bir ve işareti ( & ) gerektirir. Ancak parantezsiz & kullanmak, geçerli alt yordamın argümanlarını çağrılana örtük olarak aktarır ve parantezlerle & kullanmak prototipleri atlar.

# Calling a subroutine

# Parentheses are required here if the subroutine is defined later in the code
foo();
&foo; # (this also works, but has other consequences regarding arguments passed to the subroutine)

# Defining a subroutine
sub foo {  }

foo; # Here parentheses are not required

Alt rutin adından sonra bir argüman listesi sağlanabilir. Bağımsız değişkenler skalarlar, listeler veya karmalar olabilir.

foo $x, @y, %z;

Bir alt yordamın parametrelerinin sayı veya tür olarak bildirilmesine gerek yoktur; aslında, aramadan aramaya değişebilir. Parametrelerin herhangi bir şekilde doğrulanması, alt rutin içinde açıkça gerçekleştirilmelidir.

Diziler, öğelerine genişletilir; karmalar bir anahtar / değer çiftleri listesine genişletilir; ve partinin tamamı alt yordama tek bir düz skaler listesi olarak aktarılır.

Özel dizideki alt yordamda iletilen argümanlar ne olursa olsun kullanılabilir @_ . Öğeleri @_ , gerçek argümanlara göndermelerdir; bir öğeyi @_ değiştirmek, karşılık gelen argümanı değiştirir.

Öğelerine @_ normal şekilde abone olarak erişilebilir.

$_[0], $_[1]

Bununla birlikte, ortaya çıkan kodun okunması zor olabilir ve parametreler, istenmeyen bir şekilde referansla geçiş anlamlarına sahiptir.

Yaygın bir deyim, @_ adlandırılmış değişkenler listesine atamaktır .

my ($x, $y, $z) = @_;

Bu, anımsatıcı parametre adları sağlar ve değere göre geçiş semantiğini uygular . my Anahtar kelime Aşağıdaki değişkenler lexically içeren bloğuna kapsamlı olduğunu gösterir.

Başka bir deyim de parametreleri kaydırmaktır @_ . Bu, özellikle alt rutin yalnızca bir argüman aldığında veya $self nesneye yönelik modüllerde argümanı işlemek için yaygındır .

my $x = shift;

Alt rutinler, @_ adlandırılmış argümanları simüle etmek için bir hash atayabilir ; bu, üçten fazla parametreye sahip olma ihtimali olan alt yordamlar için Perl En İyi Uygulamaları'nda önerilir .

sub function1 {
    my %args = @_;
    print "'x' argument was '$args{x}'\n";
}
function1( x => 23 );

Altyordamlar değer döndürebilir.

return 42, $x, @y, %z;

Alt yordam bir return deyim aracılığıyla çıkmazsa , alt yordam gövdesi içinde değerlendirilen son ifadeyi döndürür. Dönüş değerindeki diziler ve karmalar, bağımsız değişkenler için olduğu gibi, skaler listelerine genişletilir.

Döndürülen ifade, alt yordamın çağırma bağlamında değerlendirilir; bu dikkatsizleri şaşırtabilir.

sub list { (4, 5, 6) }
sub array { @x = (4, 5, 6); @x }

$x = list; # returns 6 - last element of list
$x = array; # returns 3 - number of elements in list
@x = list; # returns (4, 5, 6)
@x = array; # returns (4, 5, 6)

Bir alt rutin, wantarray işlevle çağırma bağlamını keşfedebilir .

sub either {
    return wantarray ? (1, 2) : 'Oranges';
}

$x = either; # returns "Oranges"
@x = either; # returns (1, 2)

Düzenli ifadeler

Perl dili, düzenli ifadeler (RE veya regexes) yazmak için özel bir sözdizimi içerir ve yorumlayıcı, dizeleri normal ifadelerle eşleştirmek için bir motor içerir. Normal ifade motoru , yeteneklerini basit desen eşleştirmeden dizgi yakalama ve değiştirmeye kadar genişleten bir geri izleme algoritması kullanır . Normal ifade motoru, Henry Spencer tarafından yazılan normal ifadeden türetilmiştir .

Perl normal ifade sözdizimi orijinal olarak Unix Sürüm 8 normal ifadelerinden alınmıştır. Bununla birlikte, Perl'in ilk sürümünden önce ayrıldı ve o zamandan beri çok daha fazla özellik içerecek şekilde büyüdü. PHP , Ruby , Java , Microsoft'un .NET Framework ve Apache HTTP sunucusu gibi diğer birçok dil ve uygulama artık POSIX normal ifadeleri üzerinden Perl Uyumlu Normal İfadeleri benimsiyor .

Düzenli ifade sözdizimi, geçmişten dolayı son derece derli topludur. İlk düzenli ifade lehçeleri, globlardan yalnızca biraz daha anlamlıydı ve sözdizimi, bir ifadenin eşleştiği metne benzemesi için tasarlandı. Bu, desteklenen birkaç iddiayı ifade etmek için tek bir noktalama karakteri veya bir çift sınırlayıcı karakterden fazlasını kullanmamak anlamına geliyordu. Zamanla, normal ifadelerin ifadesi muazzam bir şekilde arttı, ancak sözdizimi tasarımı hiçbir zaman revize edilmedi ve noktalama işaretlerine dayanmaya devam ediyor. Sonuç olarak, normal ifadeler şifreli ve aşırı yoğun olabilir.

Kullanımlar

m// (Maç) operatörü düzenli ifade maçı tanıtır. (Buradaki tüm örneklerde olduğu gibi eğik çizgi ile sınırlandırılmışsa, baştaki m kısalık için ihmal edilebilir. m Aşağıdaki tüm örneklerde olduğu gibi varsa, eğik çizgi yerine diğer sınırlayıcılar kullanılabilir.) en basit durum, gibi bir ifade

$x =~ /abc/;

Yalnızca ve yalnızca dize $x normal ifadeyle eşleşirse doğru olarak değerlendirilir abc .

s/// (Yedek) operatörü, diğer taraftan, bir operasyon arama ve değiştirme belirtir:

$x =~ s/abc/aBc/; # upcase the b

Normal ifadelerin başka bir kullanımı, split işlev için sınırlayıcıları belirtmektir :

@words = split /,/, $line;

split Fonksiyonu normal ifadeyle eşleşir neyi ayrılır dizesinin parçaların listesini oluşturur. Bu örnekte, bir satır kendi virgülle ayrılmış bölümlerinden oluşan bir listeye bölünmüştür ve bu liste daha sonra @words diziye atanmıştır .

Sözdizimi

Değiştiriciler

Perl düzenli ifadeleri değiştiriciler alabilir . Bunlar, ifadenin anlamını değiştiren tek harfli soneklerdir:

$x =~ /abc/i; # case-insensitive pattern match
$x =~ s/abc/aBc/g; # global search and replace

Düzenli ifadelerin kompakt sözdizimi onları yoğun ve şifreli hale getirebildiğinden, /x programcıların daha okunaklı normal ifadeler yazmasına yardımcı olmak için değiştirici Perl'e eklenmiştir. Programcıların normal ifadelerin içine boşluk ve yorumlar yerleştirmesine olanak tanır :

$x =~ /
 a   # match 'a'
 .   # followed by any character
 c   # then followed by the 'c' character
 /x;

Yakalama

Normal bir ifadenin bölümleri parantez içine alınabilir; eşleşen bir dizenin karşılık gelen kısımları yakalanır . Yakalanan dizeler, sıralı yerleşik değişkenlere atanır $1, $2, $3, … ve yakalanan dizelerin bir listesi, eşleşmenin değeri olarak döndürülür.

$x =~ /a(.)c/; # capture the character between 'a' and 'c'

Yakalanan dizeler $1, $2, $3, … daha sonra kodda kullanılabilir.

Perl normal ifadeleri ayrıca, /e değiştiriciyi kullanarak yerleşik veya kullanıcı tanımlı işlevlerin yakalanan eşleşmeye uygulanmasına izin verir :

$x = "Oranges";
$x =~ s/(ge)/uc($1)/e; # OranGEs
$x .= $1; # append $x with the contents of the match in the previous statement: OranGEsge

Nesneler

Perl'de nesneye yönelik kod yazmanın birçok yolu vardır . En basit olanı "kutsanmış" referanslar kullanmaktır . Bu, herhangi bir türdeki bir referansı belirli bir pakete ait olarak tanımlayarak çalışır ve paket, kutsanmış referans için yöntemler sağlar. Örneğin, iki boyutlu bir nokta şu şekilde tanımlanabilir:

sub Point::new {
    # Here, Point->new(4, 5) will result in $class being 'Point'.
    # It's a variable to support subclassing (see the perloop manpage).
    my ($class, $x, $y) = @_;
    bless [$x, $y], $class;  # Implicit return
}

sub Point::distance {
    my ($self, $from) = @_;
    my ($dx, $dy) = ($$self[0] - $$from[0], $$self[1] - $$from[1]);
    sqrt($dx * $dx + $dy * $dy);
}

Bu sınıf, new() örnekleri oluşturmak için çağırarak distance ve bu örnekleri çağırarak kullanılabilir .

my $p1 = Point->new(3, 4);
my $p2 = Point->new(0, 0);
print $p1->distance($p2); # Prints 5

Birçok modern Perl uygulaması Moose nesne sistemini kullanır. Moose, tüm Moose kullanan sınıflar için eksiksiz bir iç gözlem sağlayan bir meta nesne protokolü olan Class :: MOP üzerine inşa edilmiştir. Bu nedenle, basit bir API kullanarak sınıflara nitelikleri, ebeveynleri, çocukları, yöntemleri vb. Hakkında soru sorabilirsiniz.

Moose sınıfları:

  • Bir sınıfın sıfır veya daha fazla özniteliği vardır.
  • Bir sınıfın sıfır veya daha fazla yöntemi vardır.
  • Bir sınıfın sıfır veya daha fazla üst sınıfı vardır (diğer bir deyişle ebeveyn sınıfları). Bir sınıf, üst sınıflarından miras alır.
  • Bir sınıf, sıfır veya daha fazla rol oynar, bu da alt sınıflandırma olmadan sınıflara önceden tanımlanmış işlevsellik ekleme yeteneği ekler.
  • Bir sınıfın bir kurucusu ve bir yıkıcısı vardır.
  • Bir sınıfın bir meta sınıfı vardır.
  • Bir sınıfın sıfır veya daha fazla yöntem değiştiricisi vardır. Bu değiştiriciler kendi yöntemlerine, atalarından miras alınan yöntemlere veya roller tarafından sağlanan yöntemlere uygulanabilir.

Moose rolleri:

  • Rol, diğer nesne yönelimli programlama dillerindeki karışımlar veya arayüzler gibi, bir sınıfın yaptığı bir şeydir . Karışımlar ve arabirimlerin aksine roller, ayrı nesne örneklerine uygulanabilir.
  • Bir rolün sıfır veya daha fazla özniteliği vardır.
  • Bir rolün sıfır veya daha fazla yöntemi vardır.
  • Bir rolün sıfır veya daha fazla yöntem değiştiricisi vardır.
  • Bir rolün sıfır veya daha fazla gerekli yöntemi vardır.

Örnekler

Moose için MooseX :: Declare uzantısı kullanılarak yazılmış bir sınıf örneği:

use MooseX::Declare;

class Point3D extends Point {
    has 'z' => (isa => 'Num', is => 'rw');

    after clear {
        $self->z(0);
    }
    method set_to (Num $x, Num $y, Num $z) {
        $self->x($x);
        $self->y($y);
        $self->z($z);
    }
}

Bu, Moose örneklerinde açıklanan Point3D adı verilen başka bir sınıfı genişleten adlı bir sınıftır . Temel sınıfına yeni bir öznitelik ekler , yöntemi yeniden tanımlar ve yöntemi genişletir . Pointzset_toclear

Referanslar

Dış bağlantılar