在Perl中是否可以声明一个子例程,以便在调用参数时不会将参数传递给它时脚本不会编译?
答案 0 :(得分:2)
其中一些可以实现 prototypes (persub),在某种程度上
Perl支持使用函数原型进行非常有限的编译时参数检查 ...
...此功能的目的主要是让您定义与内置函数类似的子例程
例如,声明为sub f1(\@)
和sub f2($$)
的子网只能被称为f1(@ary)
(数组变量,@
)和f2(SCALAR, SCALAR)
或者编译时错误。
但是还有更多的内容,有许多微妙的顾虑;请阅读下面的文档和链接。原型在编译语言中不类似于函数签名,并不打算执行该工作,即使它们可能以这种方式出现。即使是轻微的误用也会导致细微的错误。参见
FMTYEWTK about Prototypes in Perl(perlmonks)
Understand why you probably don't need prototypes( EffectivePerler )
The problem with prototypes( Modern Perl )
所有这一切,如果使用得当,可以有用。请参阅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.";
}
}