原文: https://beginnersbook.com/2017/02/subroutines-and-functions-in-perl/

Perl 允许您定义自己的函数,称为子程序。它们用于代码可重用性,因此您不必一次又一次地编写相同的代码。例如,如果您想在程序的多个位置从用户那里获取输入,那么您可以在子程序中编写代码并在需要输入的任何位置调用子程序。这样您就不必再次编写相同的代码,这也提高了代码的可读性。

子程序的优点:

1)代码可重用性

2)提高代码可读性

语法:

定义子程序

您需要做的第一件事是创建一个子程序。sub关键字用于定义 Perl 程序中的子程序。您可以选择任何有意义的子程序名称。

  1. sub subroutine_name
  2. {
  3. statement(s);
  4. return;
  5. }

调用子程序

通过使用前缀为&的子程序名称来调用子程序。您也可以在调用子程序时传递参数。

  1. &subroutine_name; #calling without parameter
  2. &subroutine_name(10);

子程序的简单例子

让我们举一个简单的例子来理解这个:

  1. #!/usr/bin/perl
  2. my $msg;
  3. # defining three subroutines
  4. sub ask_user {
  5. printf "Please enter something: ";
  6. }
  7. sub get_input {
  8. $msg = <STDIN>;
  9. return $msg;
  10. }
  11. sub show_message {
  12. printf "You entered: $msg";
  13. }
  14. #calling subroutines
  15. &ask_user;
  16. &get_input;
  17. &show_message;

输出:

  1. Please enter something: Welcome to beginnersbook
  2. You entered: Welcome to beginnersbook

将参数传递给子程序

在上面的例子中,我们在调用子程序时没有传递任何参数,但是我们可以在调用子程序时传递各种参数。所有参数(通常称为参数)都存储在特殊数组(@_)中。让我们看看下面的例子来理解这个:

  1. #!/usr/bin/perl
  2. # defining subroutine
  3. sub printparams {
  4. printf "@_\n";
  5. return;
  6. }
  7. #calling subroutine
  8. &printparams("This", "is", "my", "blog");

输出:

  1. This is my blog

在上面的例子中,我们使用特殊数组(@_)打印了所有参数。但是,如果需要,可以使用$_[n]显示所选参数,其中n是参数的索引,例如$_[0]将引用第一个参数,$_[1]将引用第二个参数。让我们举一个例子:

  1. #!/usr/bin/perl
  2. # defining subroutine
  3. sub printparams {
  4. printf "First Parameter: $_[0]\n";
  5. printf "Fourth Parameter: $_[3]\n";
  6. return;
  7. }
  8. #calling subroutine
  9. &printparams("This", "is", "my", "blog");

输出:

  1. First Parameter: This
  2. Fourth Parameter: blog

将数组传递给子程序

在上面的例子中,我们在调用子程序时传递了一些字符串参数。我们也可以将数组传递给子程序。这是一个例子:

  1. #!/usr/bin/perl
  2. # defining subroutine
  3. sub printparams {
  4. printf "First Parameter: $_[0]\n";
  5. printf "Third Parameter: $_[2]\n";
  6. printf "Fourth Parameter: $_[3]\n";
  7. printf "Sixth Parameter: $_[5]\n";
  8. return;
  9. }
  10. @array1 = ("This", "is", "text");
  11. $num = 100;
  12. @array2 = ("Welcome", "here");
  13. #calling subroutine
  14. &printparams(@array1, @array2, $num);

输出:

  1. First Parameter: This
  2. Third Parameter: text
  3. Fourth Parameter: Welcome
  4. Sixth Parameter: 100

将哈希传递给子程序

  1. #!/usr/bin/perl
  2. sub DisplayMyHash{
  3. #copying passed hash to the hash
  4. my %hash = @_;
  5. for my $key (keys %hash) {
  6. print "Key is: $key and value is: $hash{$key}\n";
  7. }
  8. }
  9. %hash = ('Item1', 'Orange', 'Item2', 'Apple', 'Item3', 'Banana');
  10. # Function call with hash parameter
  11. DisplayMyHash(%hash);

输出:

  1. Key is: Item1 and value is: Orange
  2. Key is: Item2 and value is: Apple
  3. Key is: Item3 and value is: Banana