将数组传递给子例程会将其包含在另一个数组中?
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'} } );
我注意到当我将一个数组传递给我的子例程时,它似乎被另一个数组封装了(所以有两个级别,而初始只有一个)。
我知道使用数组引用更好,但我想知道在这种特定情况下为什么它没有按预期工作。
代码示例:
#!/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'} } );