Perl - Altyordamlar
Perl alt yordamı veya işlevi, birlikte bir görevi gerçekleştiren bir deyimler grubudur. Kodunuzu ayrı alt yordamlara bölebilirsiniz. Kodunuzu farklı alt yordamlar arasında nasıl böleceğiniz size bağlıdır, ancak mantıksal olarak bölme genellikle her işlevin belirli bir görevi yerine getirmesidir.
Perl altyordam, yöntem ve işlev terimlerini birbirinin yerine kullanır.
Bir Alt Rutin Tanımlayın ve Çağırın
Perl programlama dilinde bir alt rutin tanımının genel biçimi aşağıdaki gibidir -
sub subroutine_name {
body of the subroutine
}
Bu Perl alt yordamını çağırmanın tipik yolu aşağıdaki gibidir -
subroutine_name( list of arguments );
Perl'in 5.0'dan önceki sürümlerinde, alt yordamları çağırmanın sözdizimi aşağıda gösterildiği gibi biraz farklıydı. Bu hala Perl'in en yeni sürümlerinde çalışmaktadır, ancak alt rutin prototiplerini atladığı için önerilmez.
&subroutine_name( list of arguments );
Basit bir işlevi tanımlayan ve sonra onu çağıran aşağıdaki örneğe bir göz atalım. Perl, programınızı çalıştırmadan önce derlediği için, alt rutininizi nerede açıkladığınız önemli değildir.
#!/usr/bin/perl
# Function definition
sub Hello {
print "Hello, World!\n";
}
# Function call
Hello();
Yukarıdaki program yürütüldüğünde, aşağıdaki sonucu verir -
Hello, World!
Bağımsız Değişkenleri Bir Alt Yordama Aktarma
Diğer programlama dillerinde yaptığınız gibi bir alt yordama çeşitli argümanlar iletebilirsiniz ve bunlar, @_ özel dizisi kullanılarak işlev içinde erişilebilir. Böylece, fonksiyonun ilk bağımsız değişkeni $ _ [0], ikincisi $ _ [1] ve bu böyle devam eder.
Dizileri ve karmaları herhangi bir skaler gibi bağımsız değişkenler olarak geçirebilirsiniz, ancak birden fazla dizi veya karma iletmek normalde ayrı kimliklerini kaybetmelerine neden olur. Bu nedenle, herhangi bir dizi veya karma iletmek için referansları (bir sonraki bölümde açıklanmıştır) kullanacağız.
Bir sayı listesi alıp ortalamalarını yazdıran aşağıdaki örneği deneyelim -
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_);
$sum = 0;
foreach $item (@_) {
$sum += $item;
}
$average = $sum / $n;
print "Average for the given numbers : $average\n";
}
# Function call
Average(10, 20, 30);
Yukarıdaki program yürütüldüğünde, aşağıdaki sonucu verir -
Average for the given numbers : 20
Listeleri Alt Programlara Aktarma
@_ değişkeni bir dizi olduğundan, listeleri bir alt yordama sağlamak için kullanılabilir. Bununla birlikte, Perl'in listeleri ve dizileri kabul etme ve ayrıştırma biçimi nedeniyle, tek tek öğeleri @_'den çıkarmak zor olabilir. Diğer skaler bağımsız değişkenlerle birlikte bir liste iletmeniz gerekiyorsa, aşağıda gösterildiği gibi listeyi son bağımsız değişken olarak yapın -
#!/usr/bin/perl
# Function definition
sub PrintList {
my @list = @_;
print "Given list is @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);
# Function call with list parameter
PrintList($a, @b);
Yukarıdaki program yürütüldüğünde, aşağıdaki sonucu verir -
Given list is 10 1 2 3 4
Hash'leri Altyordamlara Aktarma
Listeyi kabul eden bir alt yordama veya operatöre bir karma sağladığınızda, karma otomatik olarak bir anahtar / değer çiftleri listesine çevrilir. Örneğin -
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach my $key ( keys %hash ) {
my $value = $hash{$key};
print "$key : $value\n";
}
}
%hash = ('name' => 'Tom', 'age' => 19);
# Function call with hash parameter
PrintHash(%hash);
Yukarıdaki program yürütüldüğünde, aşağıdaki sonucu verir -
name : Tom
age : 19
Bir Alt Yordamdan Dönen Değer
Başka herhangi bir programlama dilinde yaptığınız gibi, alt programdan bir değer döndürebilirsiniz. Bir alt yordamdan bir değer döndürmüyorsanız, bir alt yordamda en son gerçekleştirilen hesaplama da otomatik olarak dönüş değeridir.
Alt yordamdan herhangi bir skaler gibi dizileri ve karmaları döndürebilirsiniz, ancak birden fazla dizi veya karma döndürmek normalde ayrı kimliklerini kaybetmelerine neden olur. Bu nedenle, bir fonksiyondan herhangi bir dizi veya karma döndürmek için referansları (sonraki bölümde açıklanmıştır) kullanacağız.
Bir sayı listesi alıp ortalamalarını döndüren aşağıdaki örneği deneyelim -
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_);
$sum = 0;
foreach $item (@_) {
$sum += $item;
}
$average = $sum / $n;
return $average;
}
# Function call
$num = Average(10, 20, 30);
print "Average for the given numbers : $num\n";
Yukarıdaki program yürütüldüğünde, aşağıdaki sonucu verir -
Average for the given numbers : 20
Bir Alt Yordamdaki Özel Değişkenler
Varsayılan olarak, Perl'deki tüm değişkenler global değişkenlerdir, yani programın herhangi bir yerinden erişilebilirler. Ama yaratabilirsinprivate değişkenler denir lexical variables ile herhangi bir zamanda my Şebeke.
myoperatör, bir değişkeni, kullanılabileceği ve erişilebileceği belirli bir kod bölgesi ile sınırlar. Bu bölgenin dışında bu değişken kullanılamaz veya erişilemez. Bu bölgeye kapsamı denir. Sözcük kapsamı genellikle, alt yordamın gövdesini tanımlayanlar veya if, while, for, foreach ve eval ifadelerinin kod bloklarını işaretleyenler gibi etrafında bir dizi parantez bulunan bir kod bloğudur .
Aşağıda, bir veya birden çok özel değişkeni kullanarak nasıl tanımlayacağınızı gösteren bir örnek yer almaktadır. my operatör -
sub somefunc {
my $variable; # $variable is invisible outside somefunc()
my ($another, @an_array, %a_hash); # declaring many variables at once
}
Global ve özel değişkenleri ayırt etmek için aşağıdaki örneği kontrol edelim -
#!/usr/bin/perl
# Global variable
$string = "Hello, World!";
# Function definition
sub PrintHello {
# Private variable for PrintHello function
my $string;
$string = "Hello, Perl!";
print "Inside the function $string\n";
}
# Function call
PrintHello();
print "Outside the function $string\n";
Yukarıdaki program yürütüldüğünde, aşağıdaki sonucu verir -
Inside the function Hello, Perl!
Outside the function Hello, World!
Local () aracılığıyla Geçici Değerler
localÇoğunlukla bir değişkenin mevcut değerinin çağrılan alt rutinler tarafından görünür olması gerektiğinde kullanılır. Bir yerel, global (anlam paketi) değişkenlere sadece geçici değerler verir. Bu, dinamik kapsam olarak bilinir . Sözcüksel kapsam belirleme, daha çok C'nin otomatik bildirimleri gibi çalışan my ile yapılır.
Local'e birden fazla değişken veya ifade verilmişse parantez içine alınmalıdır. Bu operatör, bağımsız değişken listesindeki bu değişkenlerin mevcut değerlerini gizli bir yığına kaydederek ve blok, alt rutin veya eval'dan çıktıktan sonra geri yükleyerek çalışır.
Global ve yerel değişkenleri ayırt etmek için aşağıdaki örneği kontrol edelim -
#!/usr/bin/perl
# Global variable
$string = "Hello, World!";
sub PrintHello {
# Private variable for PrintHello function
local $string;
$string = "Hello, Perl!";
PrintMe();
print "Inside the function PrintHello $string\n";
}
sub PrintMe {
print "Inside the function PrintMe $string\n";
}
# Function call
PrintHello();
print "Outside the function $string\n";
Yukarıdaki program yürütüldüğünde, aşağıdaki sonucu verir -
Inside the function PrintMe Hello, Perl!
Inside the function PrintHello Hello, Perl!
Outside the function Hello, World!
Durum () aracılığıyla Durum Değişkenleri
Özel değişkenlere benzer, ancak durumlarını koruyan ve alt rutinlerin birden çok çağrısı üzerine yeniden başlatılmayan başka bir tür sözcük değişkenleri vardır. Bu değişkenler kullanılarak tanımlanırstate Operatör ve Perl 5.9.4'ten itibaren mevcuttur.
Kullanımını göstermek için aşağıdaki örneği kontrol edelim state değişkenler -
#!/usr/bin/perl
use feature 'state';
sub PrintCount {
state $count = 0; # initial value
print "Value of counter is $count\n";
$count++;
}
for (1..5) {
PrintCount();
}
Yukarıdaki program yürütüldüğünde, aşağıdaki sonucu verir -
Value of counter is 0
Value of counter is 1
Value of counter is 2
Value of counter is 3
Value of counter is 4
Perl 5.10'dan önce, bunu şöyle yazmanız gerekirdi -
#!/usr/bin/perl
{
my $count = 0; # initial value
sub PrintCount {
print "Value of counter is $count\n";
$count++;
}
}
for (1..5) {
PrintCount();
}
Altyordam Çağrı Bağlamı
Bir alt yordamın veya ifadenin bağlamı, beklenen dönüş değeri türü olarak tanımlanır. Bu, kullanıcının almayı beklediğine bağlı olarak farklı değerler döndüren tek bir işlevi kullanmanıza olanak tanır. Örneğin, aşağıdaki localtime (), skaler bağlamda çağrıldığında bir dize döndürür, ancak liste bağlamında çağrıldığında bir liste döndürür.
my $datestring = localtime( time );
Bu örnekte, $ timestr değeri artık geçerli tarih ve saatten oluşan bir dizedir, örneğin, Per 30 Kasım 15:21:33 2000. Tersine -
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
Şimdi tek tek değişkenler, localtime () alt yordamı tarafından döndürülen karşılık gelen değerleri içerir.