如何使用所需参数的子程序?

时间:2017-10-11 00:42:40

标签: perl parameters subroutine

在Perl中是否可以声明一个子例程,以便在调用参数时不会将参数传递给它时脚本不会编译?

2 个答案:

答案 0 :(得分:2)

其中一些可以实现 prototypes (persub),在某种程度上

  

Perl支持使用函数原型进行非常有限的编译时参数检查   ...
  ...此功能的目的主要是让您定义与内置函数类似的子例程

例如,声明为sub f1(\@)sub f2($$)的子网只能被称为f1(@ary)(数组变量,@)和f2(SCALAR, SCALAR)或者编译时错误。

但是还有更多的内容,有许多微妙的顾虑;请阅读下面的文档和链接。原型在编译语言中类似于函数签名,并不打算执行该工作,即使它们可能以这种方式出现。即使是轻微的误用也会导致细微的错误。参见

所有这一切,如果使用得当,可以有用。请参阅OP。

下的ikegami评论

答案 1 :(得分:1)

我认为这类事情是你目前所做的最好的事情:

#!/usr/local/bin/perl -w
use strict;
require 5.020;
use warnings;
use feature qw( say signatures );
no warnings "experimental::signatures";

print "Enter your first name: ";
chomp(my $name1 = <STDIN>);

print "Enter your last name: ";
chomp(my $name2 = <STDIN>);

say "Calling takesOneOrTwoScalars with 2 args";
takesOneOrTwoScalars($name1, $name2);

say "Calling takesOneOrTwoScalars with 1 arg";
takesOneOrTwoScalars($name1);

say "Calling takesOneOrTwoScalars with 0 args";
takesOneOrTwoScalars();

sub takesOneOrTwoScalars($firstName, $lastName="")
{
    print "Hello, $firstName";
    if ($lastName)
    {
        say " $lastName";
    }
    else
    {
        say ", I see you didn't give your last name.";
    }
}