Perl dil yapısı - Perl language structure

yapısı Perl Programlama dili hem dilin sözdizimsel kurallarını hem de programların organize edildiği genel yolları kapsar. Perl'in tasarım felsefesi, yaygın olarak atıfta bulunulan sloganla ifade edilmektedir "bunu yapmanın birden fazla yolu var ". Olarak çoklu paradigma dinamik olarak daktilo Perl, program tasarımında büyük ölçüde esneklik sağlar. Perl ayrıca modülerleştirmeyi teşvik eder; bu, Unix köklerinin bileşen tabanlı tasarım yapısına atfedilmiştir[ne zaman? ],[1] ve boyutundan sorumludur. CPAN arşiv, 100.000'den fazla modülden oluşan, topluluk tarafından sağlanan bir depo.[2]

Temel sözdizimi

Perl'de minimal Selam Dünya program şu şekilde yazılabilir:

Yazdır "Merhaba Dünya!  N"

Bu baskılar dizi Selam Dünya! ve bir Yeni hat, sembolik olarak bir n yorumu önceki tarafından değiştirilen karakter kaçış karakteri (ters eğik çizgi). 5.10 sürümünden bu yana, yeni 'say' yerleşik[3] aynı etkiyi daha da basit bir şekilde üretir:

söyle "Selam Dünya!"

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 "Merhaba Dünya!  n" yazdır

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

#! / usr / bin / perlYazdır "Merhaba Dünya!  N";

Karma işareti karakteri bir yorum Yap Perl'de, kod satırının sonuna kadar çalışır ve derleyici tarafından yok sayılır (Windows hariç). Burada kullanılan yorum özel bir türdendir: buna shebang hat. 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. (Unutmayın, Microsoft Windows sistemleri, Perl programları tipik olarak ilişkilendirilerek çağrılır. .pl uzantı Perl tercümanı ile. Bu tür durumlarla başa çıkmak için, perl shebang satırını algılar ve anahtarlar için ayrıştırır.[4])

Kanonik biçimdeki 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, noktalı virgül ayarlayın.

Perl 5.10 Sürümü bir söyle En az "Merhaba Dünya" programını daha da kısaltarak, çıktısına örtük olarak bir satırsonu karakteri ekleyen işlev:

kullanım 5.010; Yeni 5.10 işlevlerini içe aktarmak için # mevcut olmalıdır, 5.10 değil 5.010 olduğuna dikkat edinsöyle 'Selam Dünya!'

Veri tipleri

Perl'de bir dizi temel veri tipleri. En sık kullanılan ve tartışılanlar skaler, diziler, karmalar, dosya tanıtıcıları, ve alt programlar:

TürmühürMisalAçıklama
Skaler$$ fooTek bir değer; bir sayı olabilir, bir dizi, bir dosya tanıtıcısı veya bir referans.
Dizi@@fooSıralı bir skaler koleksiyonu.
Hash%% fooDizelerden skalerlere bir harita; dizeler çağrılır anahtarlarve skalarlar denir değerler. Olarak da bilinir ilişkilendirilebilir dizi.
Dosya tanıtıcısıYok$ foo veya FOOAçık bir dosyanın opak bir temsili veya okuma, yazma veya her ikisi için başka bir hedef.
Altyordam&& fooBağımsız değişkenler iletilebilen, çalıştırılabilen ve veri döndüren bir kod parçası.
Typeglob** fooTüm türler için 'foo' adıyla simge tablosu 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 otomatik olarak değişken adını (veya enterpolasyonlu) dizede. Bir dizeyi tek tırnak içine almak değişken enterpolasyonu önler.

Örneğin, eğer $ isim dır-dir "Jim":

  • sonra print ("Benim adım $ isim") yazdıracak "Benim adım Jim" (çift tırnak içinde enterpolasyon),
  • fakat print ('Benim adım $ isim') yazdıracak "Benim adım $ isim" (tek tırnak içinde enterpolasyon yok).

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 operatörler:

  • 'bu' ve q (bu) Özdeş,
  • "$ this" ve qq ($ this) Özdeş.

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

$ multilined_string = <<EOF;Bu benim çok çizgili dizim"EOF" kelimesiyle sonlandırdığımı unutmayın.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ı 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üdür. Dize bitiştirme operatörü nokta.

$ n = '3 elma';$ m = '2 portakal';Yazdır $ n + $ m;

İçin fonksiyonlar sağlanmıştır. yuvarlama Kesirli değerlerin tam sayı değerlerine oranı: int sıfıra yuvarlayarak kesirli kısmı keser; POSIX :: tavan ve POSIX :: zemin sırasıyla her zaman yukarı ve her zaman aşağı yuvarlayın. Sayıdan dizeye dönüşümü printf "% f" veya sprintf "% f" yuvarla, kullan bankacıların yuvarlaması.

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; # sıfır sayısı$ false = 0.0; # kayan nokta olarak sıfır sayısı$ false = 0b0; # ikili sayıdaki sıfır sayısı$ false = 0x0; # onaltılık olarak sıfır sayısı$ false = '0'; # sıfır dize$ false = ""; # boş dize$ false = (); # boş liste$ false = undef; # undef'ten dönüş değeri$ false = 2-3+1 # "0" 'a dönüştürülen 0'ı hesaplar, bu nedenle yanlıştır

Diğer tüm (sıfır olmayan değerlendirme) 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 dizesini 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 {} aynı zamanda doğrudur; bu içerikte {} boş bir blok değil, çünkü perl -e 'baskı ref {}' İadeler HASH.

Değerlendirilen boole ifadeleri de skaler değerlerdir. Belgeler hangisinin belirli true veya false değeri döndürülür. Çoğu boole operatörü, true için 1 ve false için boş dize döndürür. tanımlı () fonksiyon, bir değişkenin herhangi bir değer kümesine sahip olup olmadığını belirler. Yukarıdaki örneklerde, tanımlı ($ false) hariç her değer için doğrudur undef.

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

benim $ real_result = $ boolean_result ? 1 : 0;

Dizi değerleri

Bir dizi değeri (veya liste), öğelerini virgülle ayrılmış, parantez içinde (en azından operatör önceliğinin gerektirdiği yerde) listeleyerek 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:

@ isimler = ("Billy", Joe, "Jim-Bob");@ isimler = 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 = Bölünmüş(',', '32,45,16,5');

Bir listenin tek tek öğelerine, köşeli parantez içinde sayısal bir indeks sağlanarak erişilir. Skaler işaret kullanılmalıdır. Alt listeler (dizi dilimleri), parantez içindeki sayısal indekslerin bir aralığı veya listesi kullanılarak da belirtilebilir. Bu durumda dizi işareti kullanılır. Örneğin, $ aylık [3] dır-dir "Nisan" (bir dizideki ilk öğenin dizin değeri 0'dır) ve @month [4..6] dır-dir ("Mayıs Haziran Temmuz").

Hash değerleri

Perl programcıları bir hash (veya ilişkilendirilebilir dizi ) anahtar / değer çiftleri listesinden. Anahtarlar, değerlerden, => operatör (bazen a şişman virgül ), virgül yerine tırnaksız olabilirler (barewords[5]). Aşağıdaki satırlar eşdeğerdir:

%favori = ("joe", "kırmızı", 'Sam', "mavi");%favori = (Joe => 'kırmızı', Sam => 'mavi');

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

$ favori{Joe}   = 'kırmızı';$ favori{Sam}   = 'mavi';$ favori{Oscar} = 'yeşil';

Kullanılarak birden çok öğeye erişilebilir @ bunun yerine sigil (sonucu bir liste olarak tanımlar). Örneğin, @ favori {'joe', 'sam'} şuna eşittir ('kırmızı', 'mavi').

Dosya tanıtıcıları

Dosya tanıtıcıları, kaynaklara okuma ve yazma erişimi sağlar. Bunlar genellikle diskteki dosyalardır, ancak aynı zamanda bir cihaz, boru hatta bir skaler değer.

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 ayarlanacak olan bir skaler değişkeni de kabul eder (otomatik olarak canlandırıldı ) adlandırılmış bir dosya tanıtıcısı yerine anonim bir dosya tanıtıcısı başvurusuna.

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; # sabit skaler $ PI oluşturma*bu = *o; # tüm veri türleri için takma adlar oluşturma 'bu' tüm veri türleri için 'bu'

Dizi işlevleri

Bir dizideki elemanların sayısı, dizi skaler bağlamda değerlendirilerek veya $# mühür. İkincisi, öğe sayısını değil dizideki son öğenin dizinini verir. Skalar (@array) ve ($ # dizi + 1) ifadeleri eşdeğerdir.

Hash fonksiyonları

Tüm karmalar üzerinde çalışan birkaç işlev vardır. anahtarlar işlev bir karma alır ve anahtarlarının listesini döndürür. Benzer şekilde, değerler işlev, 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.

# Her birine yapılan her çağrı bir sonraki anahtar / değer çiftini döndürür.# Tüm değerler eninde sonunda döndürülecek, ancak sıraları# tahmin edilemez.süre (($ isim, $ adres) = her biri %adres defteri) {    Yazdır "$ name, $ adreste yaşıyor  n";}# Yukarıdakine benzer, ancak alfabetik olarak sıralanmıştırher biri için benim $ next_name (çeşit anahtarlar %adres defteri) {    Yazdır "$ next_name, $ addressbook {$ next_name} adresinde yaşıyor  n";}

Kontrol Yapıları

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

C'dekine benzer blok odaklı kontrol yapılarına sahiptir, JavaScript, ve Java Programlama dilleri. Koşullar parantez içine alınır ve kontrollü bloklar parantezlerle çevrilidir:

etiket süre ( koşul ) { … }etiket süre ( koşul ) { … } devam et { … }etiket için ( init-expr ; koşul-ifade ; incr-expr ) { … }etiket her biri için var ( liste ) { … }etiket her biri için var ( liste ) {…} Devam et {…} eğer ( koşul ) { … }Eğer ( koşul ) {…} Değilse {…} eğer ( koşul ) {…} Elsif ( koşul ) { … } Başka { … }

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

Beyan Eğer koşul ;Beyan sürece koşul ;Beyan süre koşul ;Beyan a kadar koşul ;Beyan her biri için liste ;

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

ifade ve ifadeifade && ifadeifade veya ifadeifade || ifade

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

Akış kontrolü anahtar kelimeleri Sonraki (C'ye karşılık gelir devam et), son (C'ye karşılık gelir kırmak), dönüş, ve yeniden yapmak 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:

Sonuçlar = grep {…} listeSonuçlar = grep ifade, listeSonuçlar = harita {…} listeSonuçlar = harita ifade, liste

grep tüm öğelerini döndürür liste bunun için kontrollü blok veya ifadenin doğru olarak değerlendirildiği. harita her bir eleman için kontrollü bloğu veya ifadeyi değerlendirir liste ve elde edilen değerlerin bir listesini verir. Bu yapılar basit bir fonksiyonel programlama tarzı.

5.10.0 sürümüne kadar anahtar deyimi Perl 5'te 5.10.0'dan itibaren, çok yönlü bir dallanma ifadesi verilen/ne zaman aşağıdaki formu alan mevcuttur:

v5.10 kullanın; Verilen yeni 5.10 işlevlerini içe aktarmak için # mevcut olmalıdır ( ifade ) { ne zaman ( koşul ) { … } varsayılan { … } }

Sözdizimsel olarak, bu yapı benzer şekilde davranır deyimleri değiştir diğer dillerde bulunur, 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, açık devam etbunun yerine anahtar davranışını taklit etmek için gereklidir.

Perl 5.10 kullanmayanlar için Perl belgeleri, diğer kontrol yapılarını kullanarak aynı etkiyi elde etmenin yarım düzine yolunu açıklar. Ayrıca, kardeş dilde modellenmiş işlevsellik sağlayan bir Anahtar modülü de vardır. Raku. Kullanılarak uygulanır kaynak filtresi, bu nedenle kullanımı gayri resmi olarak tavsiye edilmez.[6]

Perl şunları içerir: etikete git ifadesi, ancak nadiren kullanılır. Bir git Diğer dillerde, akış kontrol seçeneklerinin genişliğinden dolayı Perl'de sık görülmediği için çağrılır.

Ayrıca bir git & alt gerçekleştiren ifade kuyruk çağrısı. Geçerli alt programı sonlandırır ve hemen belirtilen alt. Bu, arayan kişinin daha verimli çalışabileceği durumlarda kullanılır. yığın Perl'in kendisinden daha yönetim (tipik olarak mevcut yığında değişiklik gerekmediği için) ve derin özyinelemede, kuyruk arama, geri dönüşte kapsam / yığın yönetiminin ek yükünü ortadan kaldırdığı için performans üzerinde önemli olumlu etkilere sahip olabilir.

Altyordamlar

Altyordamlar ile tanımlanmıştır alt anahtar kelime ve sadece isimlendirilerek çağrılır. Söz konusu alt rutin henüz bildirilmediyse, çağırma işlev adından sonra parantez veya bir ve işareti (&) ondan önce. Ama kullanarak & parantez olmadan da geçerli alt yordamın argümanlarını çağrılana örtük olarak iletir ve & parantezler ise prototipleri atlar.

# Bir alt programı çağırmak# Alt yordam kodda daha sonra tanımlanmışsa, burada parantez gereklidirfoo();&foo; # (bu da işe yarar, ancak alt rutine aktarılan argümanlarla ilgili başka sonuçları vardır)# Bir alt yordamı tanımlamaalt foo {  }foo; # Burada parantez gerekli değildir

Alt rutin adından sonra bir argüman listesi sağlanabilir. Bağımsız değişkenler skaler, liste veya karma 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 lotun tamamı alt rutine tek bir düz skaler listesi olarak aktarılır.

Özel dizideki alt yordama hangi argümanlar iletilirse aktarılır @_. Unsurları @_ gerçek argümanlara referanslardır; bir unsurunu değiştirmek @_ ilgili argümanı değiştirir.

Unsurları @_ her zamanki şekilde abone olarak erişilebilir.

$_[0], $_[1]

Bununla birlikte, ortaya çıkan kodun okunması zor olabilir ve parametreler referansla geçiş istenmeyen olabilecek anlambilim.

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

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

Bu, anımsatıcı parametre adları sağlar ve değere göre geçiş anlambilim. benim anahtar sözcüğü, aşağıdaki değişkenlerin sözcüksel olarak kapsayan bloğa dahil edildiğini gösterir.

Başka bir deyim de parametreleri kaydırmaktır. @_. Bu, özellikle alt rutin yalnızca bir argüman aldığında veya $ self nesne yönelimli modüllerde argüman.

benim $ x = vardiya;

Altyordamlar atayabilir @_ adlandırılmış argümanları simüle etmek için bir karma; bu tavsiye edilir Perl En İyi Uygulamaları Üçten fazla parametresi olması muhtemel olan alt programlar için.[7]

alt işlev1 {    benim % argüman = @_;    Yazdır "'x' bağımsız değişkeni '$ args {x}'  n" idi;}işlev1( x => 23 );

Altyordamlar değer döndürebilir.

dönüş 42, $ x, @y, % z;

Alt rutin bir dönüş deyimi, 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, skalar listelerine genişletilir.

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

alt liste { (4, 5, 6) }alt dizi { @x = (4, 5, 6); @x }$ x = liste; # 6 değerini döndürür - listenin son öğesi$ x = dizi; # 3 - listedeki eleman sayısını döndürür@x = liste; # iade (4, 5, 6)@x = dizi; # iade (4, 5, 6)

Bir alt program, çağrı bağlamını Wantarray işlevi.

alt ya {    dönüş Wantarray ? (1, 2) : 'Portakallar';}$ x = ya; # "Portakal" ı döndürür@x = ya; # iade (1, 2)

Düzenli ifadeler

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

Perl normal ifade sözdizimi ilk 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ü. Diğer birçok dil ve uygulama artık benimseniyor Perl Uyumlu Normal İfadeler bitmiş POSIX gibi normal ifadeler PHP, Yakut, Java, Microsoft'un .NET Framework,[8] ve Apache HTTP sunucusu.

Normal ifade sözdizimi, geçmişe bağlı olarak son derece kompakttır. İlk düzenli ifade lehçeleri, sadece biraz daha etkileyici idi. küre ve sözdizimi, bir ifadenin eşleştiği metne benzemesi için tasarlandı.[kaynak belirtilmeli ] 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, düzenli 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 // (eşleşme) operatörü bir normal ifade eşleşmesi sunar. (Buradaki tüm örneklerde olduğu gibi eğik çizgilerle sınırlandırılmışsa, baştaki m kısalık için ihmal edilebilir. Eğer m aşağıdaki örneklerin tümünde olduğu gibi, bölü çizgileri yerine diğer sınırlayıcılar kullanılabilir.) En basit durumda, gibi bir ifade

$ x =~ /ABC/;

doğru olarak değerlendirilir ancak ve ancak dize $ x normal ifadeyle eşleşir ABC.

s /// (ikame) operatörü ise bir ara ve değiştir işlemini belirtir:

$ x =~ s / abc / aBc /; # büyük harf

Normal ifadelerin başka bir kullanımı, sınırlayıcıları belirtmektir. Bölünmüş işlev:

@kelimeler = Bölünmüş /,/, $ line;

Bölünmüş işlev, dizgenin normal ifadeyle eşleşen parçalarının bir 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 @kelimeler dizi.

Sözdizimi

Değiştiriciler

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

$ x =~ / abc / i; # büyük / küçük harfe duyarlı olmayan kalıp eşleşmesi$ x =~ s / abc / aBc / g; # genel arama ve değiştirme

Normal ifadelerin kompakt sözdizimi onları yoğun ve şifreli hale getirebileceğinden, / x programcıların daha okunaklı düzenli ifadeler yazmasına yardımcı olmak için Perl'e değiştirici eklendi. Programcıların boşluk ve yorum koymasına olanak tanır içeride düzenli ifadeler:

$ x =~ / a # 'a' ile eşleşir . # ve ardından herhangi bir karakter c # ve ardından 'c' karakteri gelir / x;

Yakalama

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

$ x =~ /AC/; # 'a' ve 'c' arasındaki karakteri yakalayın

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

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

$ x = "Portakallar";$ x =~ s / (ge) / uc (1 $) / e; # OranGE'ler$ x .= $1; # önceki açıklamadaki maçın içeriğine $ x ekleyin: OranGEsge

Nesneler

Yazmanın birçok yolu var nesne odaklı Perl kodu. En basit olanı "kutsanmış" kullanmaktır Referanslar. Bu, herhangi bir türdeki 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:

alt Nokta::yeni {    # Burada, Nokta-> new (4, 5), $ class'ın 'Nokta' olmasına neden olacaktır.    # Alt sınıflamayı desteklemek için bir değişkendir (perloop kılavuzuna bakın).    benim ($ sınıf, $ x, y) = @_;    kutsamak [$ x, y], $ sınıf;  # Örtülü dönüş}alt Nokta:: mesafe {    benim ($ self, $ 'dan) = @_;    benim ($ dx, $ dy) = ($$ self[0] - $$ from[0], $$ self[1] - $$ from[1]);    sqrt($ dx * $ dx + $ dy * $ dy);}

Bu sınıf, çağrılarak kullanılabilir yeni() örnekleri oluşturmak ve çağırmak için mesafe bu durumlarda.

benim $ p1 = Nokta->yeni(3, 4);benim $ p2 = Nokta->yeni(0, 0);Yazdır $ p1->mesafe($ p2); # Baskılar 5

Birçok modern Perl uygulaması, Kanada geyiği nesne sistemi.[kaynak belirtilmeli ] 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. Böylece, basit bir API kullanarak sınıflara nitelikleri, ebeveynleri, çocukları, yöntemleri vb. Hakkında sorular 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 adıyla 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 yapar, 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, bir sınıfın yaptığı bir şeydir. Mixins veya diğer nesne yönelimli programlama dillerindeki arayüzler. Karışımlar ve arayüzlerden farklı olarak 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

MooseX :: Declare kullanılarak yazılmış bir sınıf örneği[9] Moose'un uzantısı:

kullanım MooseX :: Bildirmek;sınıf Point3D genişler Nokta {    vardır 'z' => (isa => 'Num', dır-dir => 'rw');    sonra açık {        $ self->z(0);    }    yöntem ayarlanır (Num $ x, Num y, Num $ z) {        $ self->x($ x);        $ self->y(y);        $ self->z($ z);    }}

Bu bir sınıftır Point3D adlı başka bir sınıfı genişleten Nokta açıklandı Moose örnekleri. Temel sınıfına yeni bir öznitelik ekler z, yöntemi yeniden tanımlıyor ayarlanır ve yöntemi genişletir açık.

Referanslar

  1. ^ Orwant Jon (2003). Oyunlar, saptırmalar ve Perl kültürü: Perl dergisinin en iyileri. ISBN  978-0-596-00312-8.
  2. ^ "CPAN ön sayfası". Alındı 2011-12-09.
  3. ^ "Özellikleri". Perldoc. Perl.org. Alındı 24 Temmuz 2017.
  4. ^ "perlrun". perldoc.perl.org - Perl programlama dili için resmi belgeler. Alındı 2011-01-08.
  5. ^ Wainwright, Peter (2005). Pro Perl. Profesyonelden Uzman Serisine. Apress. s. 64. ISBN  978-1-59059-438-4. Alındı 2010-08-03. […] Kısa sözcük dizisi olarak bilinen tırnaksız bir dize […]
  6. ^ anahtarı kullanarak
  7. ^ Damian Conway, Perl En İyi Uygulamaları Arşivlendi 2011-09-18 de Wayback Makinesi, s. 182
  8. ^ Microsoft Corp., ".NET Framework Normal İfadeleri", .NET Framework Geliştirici Kılavuzu, [1]
  9. ^ MooseX :: Belgeleri beyan et

Dış bağlantılar