perl 将内部数组作为参数发送给子例程
perl send internal array as argument to subroutine
我有一个像这样的二维数组:
$map[0][0] = 'a';
$map[0][1] = 'b';
$map[1][0] = 'c';
$map[1][1] = 'd';
我只想将 $map[1] 下的所有内容(通过引用)传递给子例程。怎么做?
您可以发送数组引用,
sub mysub {
my ($aref) = @_;
# work with @$aref ..
}
mysub($map[1]);
只需传递标量 $map[1]
。
fn($map[1]);
sub fn
{
my @loc_map_1 = @{ $_[0] };
请记住,perl 没有 "real" 二维数组。在您的例子中, map
是一个包含 2 个对数组的引用的数组。
Perl 没有多维数组。
您拥有的是一个数组,该数组的每个元素都是对另一个数组的引用。您可能想阅读有关 Perl References 的内容,因为这是 Perl 允许您构建一些非常复杂的数据结构的方式。
很多人认为它是一个多维数组,在某些情况下您可以这样对待它。但是,我更喜欢 ->
语法,它提醒我这只是对引用的引用。
$map[0]->[0] = 'a';
$map[0]->[1] = 'b';
$map[1]->[0] = 'c';
$map[1]->[1] = 'd';
现在,我可以拆开数据结构了:
@map
:这是一个包含两项的数组,$map[0]
和 $map[1]
。
$map[0]->[]
:这是对另一个数组的引用。该数组还必须包含其中的项目。
$map[1]->[]
:这是对另一个数组的另一个 引用。该数组中有两项。
请注意,$map[1]->[]
表示 $map[1]
包含一个数组引用。 Thqt 意味着您可以传递 $map[1]
作为对该内部数组的引用。
mysub ($map[1]);
这是一个简单的程序:
#! /usr/bin/env perl
#
use strict;
use warnings;
use feature qw(say);
my @map;
$map[0]->[0] = 'a';
$map[0]->[1] = 'b';
$map[1]->[0] = 'c';
$map[1]->[1] = 'd';
mysub( $map[1] );
sub mysub {
my $array_ref = shift;
my @array = @{ $array_ref }; # Dereference your reference
for my $index ( 0..$#array ) {
say "$map[1]->[$index] = $array[$index]";
}
}
这会打印:
$map[1]->[0] = c
$map[1]->[1] = d
现在,您明白我为什么喜欢 ->
语法了,尽管它确实完全没有必要。它有助于提醒我我正在处理什么。
我有一个像这样的二维数组:
$map[0][0] = 'a';
$map[0][1] = 'b';
$map[1][0] = 'c';
$map[1][1] = 'd';
我只想将 $map[1] 下的所有内容(通过引用)传递给子例程。怎么做?
您可以发送数组引用,
sub mysub {
my ($aref) = @_;
# work with @$aref ..
}
mysub($map[1]);
只需传递标量 $map[1]
。
fn($map[1]);
sub fn
{
my @loc_map_1 = @{ $_[0] };
请记住,perl 没有 "real" 二维数组。在您的例子中, map
是一个包含 2 个对数组的引用的数组。
Perl 没有多维数组。
您拥有的是一个数组,该数组的每个元素都是对另一个数组的引用。您可能想阅读有关 Perl References 的内容,因为这是 Perl 允许您构建一些非常复杂的数据结构的方式。
很多人认为它是一个多维数组,在某些情况下您可以这样对待它。但是,我更喜欢 ->
语法,它提醒我这只是对引用的引用。
$map[0]->[0] = 'a';
$map[0]->[1] = 'b';
$map[1]->[0] = 'c';
$map[1]->[1] = 'd';
现在,我可以拆开数据结构了:
@map
:这是一个包含两项的数组,$map[0]
和$map[1]
。$map[0]->[]
:这是对另一个数组的引用。该数组还必须包含其中的项目。$map[1]->[]
:这是对另一个数组的另一个 引用。该数组中有两项。
请注意,$map[1]->[]
表示 $map[1]
包含一个数组引用。 Thqt 意味着您可以传递 $map[1]
作为对该内部数组的引用。
mysub ($map[1]);
这是一个简单的程序:
#! /usr/bin/env perl
#
use strict;
use warnings;
use feature qw(say);
my @map;
$map[0]->[0] = 'a';
$map[0]->[1] = 'b';
$map[1]->[0] = 'c';
$map[1]->[1] = 'd';
mysub( $map[1] );
sub mysub {
my $array_ref = shift;
my @array = @{ $array_ref }; # Dereference your reference
for my $index ( 0..$#array ) {
say "$map[1]->[$index] = $array[$index]";
}
}
这会打印:
$map[1]->[0] = c
$map[1]->[1] = d
现在,您明白我为什么喜欢 ->
语法了,尽管它确实完全没有必要。它有助于提醒我我正在处理什么。