我注意到当我将一个数组传递给我的子程序时,似乎它被另一个数组封装(所以两个级别,而初始只有一个)。
我知道使用对数组的引用更好,但我在这个特定的情况下想知道它为什么没有按预期工作。
#!/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'
]
];
答案 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}
扩展为列表 }:
@{ ... }