Latest web development tutorials

بيرل روتين (وظيفة)

بيرل روتين التي هي دالة معرفة من قبل المستخدم.

بيرل روتين الذي هو قطعة من التعليمات البرمجية لإجراء فصل المهام الخاصة، يمكن أن تجعل للحد من ازدواجية رمز وجعل البرنامج سهلة القراءة.

بيرل روتين يمكن أن تظهر في أي مكان في البرنامج، بناء الجملة كما يلي:

sub subroutine{
   statements;
}

روتين جملة المكالمة:

subroutine( 参数列表 );

بيرل 5.0 في الدعوة روتين الإصدارات التالية على النحو التالي:

&subroutine( 参数列表 );

في الإصدار الجديد، على الرغم من أنه يدعم طريقة الدعوة، ولكن لا ينصح به.

التالي نظرنا هو المثال البسيط:

#!/usr/bin/perl

# 函数定义
sub Hello{
   print "Hello, World!\n";
}

# 函数调用
Hello();

البرنامج المذكور أعلاه، والناتج هو:

Hello, World!

يمر المعلمات إلى الوظائف الفرعية

بيرل روتين يمكن أن يقبل معلمات متعددة وبرامج أخرى، واستخدام مجموعة_ المعلمات روتين الخاصة المشار إليها.

وهكذا، فإن الحجة الأولى روتين هو $ _ [0]، والحجة الثانية هي $ _ [1]، وهلم جرا.

سواء المعلمات مفردة أو مجموعة نوع، المستخدم المعلمة التي تم تمريرها إلى روتين، بيرل الافتراضي من الإشارة ندعو لهم.

#!/usr/bin/perl

# 定义求平均值函数
sub Average{
   # 获取所有传入的参数
   $n = scalar(@_);
   $sum = 0;

   foreach $item (@_){
      $sum += $item;
   }
   $average = $sum / $n;
   print '传入的参数为 : ',"@_\n";           # 打印整个数组
   print "第一个参数值为 : $_[0]\n";         # 打印第一个参数
   print "传入参数的平均值为 : $average\n";  # 打印平均值
}

# 调用函数
Average(10, 20, 30);

البرنامج المذكور أعلاه، والناتج هو:

传入的参数为 : 10 20 30
第一个参数值为 : 10
传入参数的平均值为 : 20

يمكن للمستخدم تغيير قيمة المعلمات الفعلية المقابلة عن طريق تغيير القيم في مجموعة_.

تمريرها إلى قائمة روتين

منذ_ متغير صفيف، لذلك يمكن تمرير القائمة إلى روتين.

ولكن إذا كنا بحاجة لتمرير العددية ومجموعة معلمات، تحتاج إلى تدرج في المعلمة الأخيرة، على النحو التالي:

#!/usr/bin/perl

# 定义函数
sub PrintList{
   my @list = @_;
   print "列表为 : @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);

# 列表参数
PrintList($a, @b);

وسيقوم البرنامج أعلاه دمج العددية ومجموعة من النتائج الإخراج:

列表为 : 10 1 2 3 4

يمكننا تمرير صفائف برامج فرعية متعددة والتجزئة، ولكن اذا كان مر المصفوفات والتجزئة متعددة، من شأنها أن تؤدي إلى فقدان هوية مستقلة. لذلك نحن بحاجة إلى استخدام إشارة (سوف المقطع التالي إدخال) لتمرير.

البعثرة التي تم تمريرها إلى برنامج ثانوي

عندما يتم تمرير جدول التجزئة إلى روتين، سيتم نسخه إلى_ في جدول التجزئة سيكون لتوسيع قائمة أزواج مفتاح / قيمة.

#!/usr/bin/perl

# 方法定义
sub PrintHash{
   my (%hash) = @_;

   foreach my $key ( keys %hash ){
      my $value = $hash{$key};
      print "$key : $value\n";
   }
}
%hash = ('name' => 'w3big', 'age' => 3);

# 传递哈希
PrintHash(%hash);

إخراج تنفيذ البرنامج المذكور أعلاه هو:

age : 3
name : w3big

قيمة الإرجاع روتين

وروتين يمكن أن يكون مثل استخدام لغات البرمجة الأخرى البيان عودة لإرجاع القيم.

إذا لم يكن هناك بيان المقابل، ثم السطر الأخير من البيان روتين كقيمة الإرجاع.

#!/usr/bin/perl

# 方法定义
sub add_a_b{
   # 不使用 return
   $_[0]+$_[1];  

   # 使用 return
   # return $_[0]+$_[1];  
}
print add_a_b(1, 2)

إخراج تنفيذ البرنامج المذكور أعلاه هو:

3

روتين يمكن أن نعود سكالارس، المصفوفات والتجزئة، ولكن في المقابل المصفوفات والتجزئة متعددة، سوف يؤدي إلى فقدان هوية مستقلة. لذلك نحن بحاجة إلى استخدام إشارة (سوف المقطع التالي إدخال) للعودة المصفوفات متعددة، ووظائفها.


المتغيرات خاصة روتين

افتراضيا، بيرل، كل المتغيرات المتغيرات العالمية، مما يعني أن المتغير يمكن استدعاؤها من أي مكان في البرنامج.

إذا نحن بحاجة إلى تعيين متغيرات خاصة، استخدام المشغلالخاص بي لتعيين.

مشغلبلدي يخلق متغيرات راقب مفرداتيا، والمتغيرات التي تم إنشاؤها باستخدام مكان بقاء ليفي بداية البيان حتى نهاية نطاق الإغلاق.

يشير مجالا لإغلاق قد تكون في منطقة الأقواس الزوج يمكن أن يكون ملف، ويمكن أيضا أن يكون إذا، في حين، ل، foreach، سلسلة حدة التقييم.

يوضح المثال التالي كيفية تعريف واحد أو أكثر من المتغيرات خاصة:

sub somefunc {
   my $variable; # $variable 在方法 somefunc() 外不可见
   my ($another, @an_array, %a_hash); #  同时声明多个变量
}
#!/usr/bin/perl

# 全局变量
$string = "Hello, World!";

# 函数定义
sub PrintHello{
   # PrintHello 函数的私有变量
   my $string;
   $string = "Hello, w3big!";
   print "函数内字符串:$string\n";
}
# 调用函数
PrintHello();
print "函数外字符串:$string\n";

إخراج تنفيذ البرنامج المذكور أعلاه هو:

函数内字符串:Hello, w3big!
函数外字符串:Hello, World!

متغيرات مهمة مؤقتة

يمكننا استخدام القيم المؤقتة المحلية للمتغيرات العالمية، ونطاق القيمة الأصلية بعد خروج هو أيضا الى الوراء.

المتغيرات المحلية حددت في البرنامج الرئيسي لم يكن موجودا، ولكن توجد في روتين والدعوة روتين روتين. عند تعريف يمكن أن تعطيه قيمة، مثل:

#!/usr/bin/perl

# 全局变量
$string = "Hello, World!";

sub Printw3big{
   # PrintHello 函数私有变量
   local $string;
   $string = "Hello, w3big!";
   # 子程序调用的子程序
   PrintMe();
   print "Printw3big 函数内字符串值:$string\n";
}
sub PrintMe{
   print "PrintMe 函数内字符串值:$string\n";
}

sub PrintHello{
   print "PrintHello 函数内字符串值:$string\n";
}

# 函数调用
Printw3big();
PrintHello();
print "函数外部字符串值:$string\n";

إخراج تنفيذ البرنامج المذكور أعلاه هو:

PrintMe 函数内字符串值:Hello, w3big!
Printw3big 函数内字符串值:Hello, w3big!
PrintHello 函数内字符串值:Hello, World!
函数外部字符串值:Hello, World!

المتغيرات ثابتة

شركات الدولة وظيفة مشابهة لمعدل ثابت C، وسوف كلمات دولة أصبحت المتغيرات المحلية الثابتة.

الدولة المتغيرات أيضا المعجمية، إلا أن تعريف المجال المتغير المفردات غير صحيح، على سبيل المثال:

#!/usr/bin/perl

use feature 'state';

sub PrintCount{
   state $count = 0; # 初始化变量

   print "counter 值为:$count\n";
   $count++;
}

for (1..5){
   PrintCount();
}

إخراج تنفيذ البرنامج المذكور أعلاه هو:

counter 值为:0
counter 值为:1
counter 值为:2
counter 值为:3
counter 值为:4

ملاحظة 1: يمكن الدولة فقط إنشاء المتغيرات مغلقة راقب داخل روتين.

ملاحظة 2: هو عرض الدولة من بيرل 5.9.4، ويجب أن يضاف ذلك قبل الاستخدام للاستخدام.

ملاحظة 3: الدولة أن تعلن العددية، مجموعة، التجزئة. ولكن عندما يعلن المصفوفات والتجزئة، لا يمكن تهيئة ذلك (بيرل 5.14 غير معتمد على الأقل).


سياق استدعاء روتين

المكالمات روتين، فإنه سيعود إلى القيم من أنواع مختلفة اعتمادا على السياق، مثل LOCALTIME التالية () روتين في سياق عددي إرجاع سلسلة في سياق القائمة بإرجاع القائمة:

#!/usr/bin/perl

# 标量上下文
my $datestring = localtime( time );
print $datestring;

print "\n";

# 列表上下文
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
printf("%d-%d-%d %d:%d:%d",$year+1990,$mon+1,$mday,$hour,$min,$sec);

print "\n";

إخراج تنفيذ البرنامج المذكور أعلاه هو:

Sun Jun 12 15:58:09 2016
2106-6-12 15:58:9