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

Passing an array to a subroutine encloses it in another array?

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

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

代码示例:

#!/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'
          ]
        ];
  • 您正在将 $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 将数组引用作为 单个参数,是更好的选择

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'
        ];

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

如果您希望 testSub 接收 URL 列表,您必须将 数组 $item->{urls} 扩展为 列表 @{ ... }:

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