函数调用如果第二个参数为null,第三个参数给出第二个参数?

Phi*_*mon 1 perl function

我是perl的新手,我定义了一个函数

sub ex_arg($_)
{
    print "$_[0]\n";
    print "$_[1]\n";
    print "$_[2]\n";
}
1;
Run Code Online (Sandbox Code Playgroud)

在另一个页面我打电话给那个页面.

require "ex_arg.pl";
ex_arg(1,2,3);
ex_arg(1,,3);  #in the second function i want the second parameter to be null
1;
Run Code Online (Sandbox Code Playgroud)

是否有可能做到这一点.我没有得到第二个参数而是第三个参数作为第二个参数.

难道我做错了什么.请纠正我.

提前致谢.

TLP*_*TLP 8

问题是您的参数列表在传递给子例程之前不会为第二个参数保留空值.该列表1,,3将扩展到与列表相同的列表中1,3.

您需要传递一些实际存在的值,例如undef空字符串.

ex_arg(1, undef, 3);
Run Code Online (Sandbox Code Playgroud)

那也许就像是

sub ex_arg {
    my ($arg1, $arg2, $arg3) = @_;
    if (! defined($arg2)) {            # checking if arg2 is empty
        # do something
    }
}
Run Code Online (Sandbox Code Playgroud)

在相关的说明中,除非您知道它的作用,否则不应在子例程声明中使用原型.它们用于在子例程中创建特定行为,并且与子例程中的变量无关,它与其他语言的工作方式无关.

sub foo ( ... ) {
       #^^^^^^^----- prototypes

sub foo {      # this is the standard way to declare
Run Code Online (Sandbox Code Playgroud)


Сух*_*й27 5

试试这个,

ex_arg(1, undef, 3);
Run Code Online (Sandbox Code Playgroud)

ex_arg(1, , 3) 对perl来说是一样的 ex_arg(1, 3)

perl -MO=Deparse -e 'ex_arg(1, , 3);'
ex_arg(1, 3);   # <<<<<< deparsed
Run Code Online (Sandbox Code Playgroud)

旁注; 如果您不想使用原型,那么sub ex_arg {..}就是您想要的.

身高my ($x,$y) = @_;超过$_[0]$_[1].