将数组传递给子程序将其包含在另一个数组中?

时间:2016-08-27 21:39:09

标签: arrays perl subroutine

我注意到当我将一个数组传递给我的子程序时,似乎它被另一个数组封装(所以两个级别,而初始只有一个)。

我知道使用对数组的引用更好,但我在这个特定的情况下想知道它为什么没有按预期工作。

代码示例:

#!/usr/local/bin/perl

use Data::Dumper;

sub testSub {
    my (@arr) = (@_);
    print Dumper \@arr;
}

my @testArray = ();
push @testArray, {
    'key1' => 'value1',
    'key2' => 'value2',
    'urls' => [ 'www.example.com' ]
};

print Dumper @testArray;

foreach my $item ( @testArray ) {

    my @urls = testSub( $item->{'urls'} );
}

输出

$VAR1 = {
          'urls' => [
                      'www.example.com'
                    ],
          'key1' => 'value1',
          'key2' => 'value2'
        };
$VAR1 = [
          [
            'www.example.com'
          ]
        ];

3 个答案:

答案 0 :(得分:1)

  • 您正在将$item->{'urls'}传递给您的子程序

  • 您的Data::Dumper输出清楚地显示哈希元素看起来像这样

    'urls' => [ 'www.example.com' ]
    
  • 当您致电testSub时,您正在进行相当于

    的作业
    my @arr = ( [ 'www.example.com' ] );
    
  • 您的语句print Dumper \@arr数组引用传递给Dumper,因此显示

    [ [ 'www.example.com' ] ]
    

如果您在调用Dumper时保持一致,这将有助于您的混淆。 print Dumper @testArray@testArray的内容作为单个参数传递(尽管在这种情况下,数组只有一个元素),而print Dumper \@arr将数组引用作为单个参数传递,是更好的选择

答案 1 :(得分:1)

my @urls = testSub( $item->{'urls'}, 'abc' );

Result of Dumper in subrotine:
$VAR1 = [
          [
            'www.example.com'
          ],
          'abc'
        ];

通过引用传递的数组。因为在编译时perl不知道标量$item->{'urls'}中会有什么。

my @urls = testSub( @{ $item->{'urls'} }, 'abc' );

Result of Dumper in subrotine:
$VAR1 = [
          'www.example.com',
          'abc'
        ];

现在编译器需要一个数组并将其转换为列表。

答案 2 :(得分:0)

如果您希望testSub收到网址列表,则必须使用{{1}将数组 $item->{urls}扩展为列表 }:

@{ ... }