【问题标题】:get param function array in perl在perl中获取参数函数数组
【发布时间】:2014-12-11 20:47:26
【问题描述】:

我想获取我在函数中发送的数组,但它似乎是空的。 我用参数中的数组调用send_file();

send_file($addr, @curfile);

这就是我取回参数的方式

sub send_file($$)
{
    my $addr = $_[0];
    my @elem = @_;
    ...
}

为什么my @elem 是空的?我怎样才能在不丢失所有内容的情况下取回数组?

【问题讨论】:

  • 尝试使用对数组的引用作为参数send_file($addr, \@curfile); ---> my @elem = @{$_[1]};

标签: arrays perl function parameters


【解决方案1】:

不要使用原型。他们的目的是更改您不需要的源的解析。

sub send_file
{
    my $addr = shift;
    my @elem = @_;
    ...
}

send_file($addr, @curfile);

【讨论】:

    【解决方案2】:

    你应该通过引用来传递你的数组:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $test_scalar = 10;
    my @test_array  = qw(this is a test);
    
    sub test($\@)
    {
        my ($scalar, $array) = @_;
    
        print "SCALAR = $scalar\n";
        print "ARRAY  = @$array\n";
    }
    
    test($test_scalar, @test_array);
    
    system 'pause';
    

    输出:

    SCALAR = 10
    ARRAY  = this is a test
    Press any key to continue . . .
    

    编辑:

    如果您想在不通过引用传递的情况下做同样的事情,请将您的 $$ 更改为 $@ 并使用 shift 以便第一个参数最终不会包含在您的数组中。不过,通过引用传递数组是更好的编码实践。 . .这只是为了向您展示如何在不通过引用传递的情况下完成它:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $test_scalar = 10;
    my @test_array  = qw(this is a test);
    
    sub test($@)
    {
        my ($scalar, @array) = @_;
    
        print "SCALAR = $scalar\n";
        print "ARRAY  = @array\n";
    }
    
    test($test_scalar, @test_array);
    
    system 'pause';
    

    这将为您提供相同的输出。

    如果您确实没有必要,也可以完全去掉 $@。

    【讨论】:

    • @mpapec:我的例子并非不准确。试试看,数组引用只是一个标量,如果在函数原型中使用“$”声明数组引用,子程序将正确处理。在原型中使用“$”还是“\@”都没有关系,两者的作用相同。如果您在使用这两种方法传入的数组引用上使用ref() 函数,则在这两种情况下都将返回“ARRAY”。无论哪种方式,它都将输入识别为数组引用。
    • @mpapec:如果您不相信我,只需运行我的代码,看看它的行为是否相同 :)
    • 我指的是第二个例子。首先在功能上是正确的。
    • Ohhhhhh 我明白了,我的意思是说 $scalar = shift 而不是 $scalar = $_[0] 这样标量会在数组被填充之前从“@_”中取出。不错,我刚刚看到第一个格式的所有更改,并假设它就是您所说的那个。
    【解决方案3】:

    为什么我的@elem 是空的?

    您的@elem 不是空的,它正好有两个元素。第一个是$addr 的值,第二个是@curfile 数组中元素的大小/数量。这是由于 $$ prototype 定义需要两个标量,所以 scalar @curfile 作为第二个参数传递。

    我怎样才能在不丢失所有内容的情况下取回数组?

    既然你没有利用原型的优势,就省略原型部分,

    sub send_file {
        my ($addr, @elem) = @_;
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 1970-01-01
      • 2021-09-16
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      相关资源
      最近更新 更多