perl发送内部数组作为子例程的参数

时间:2015-01-13 20:14:49

标签: perl

我有一个像这样的二维数组:

$map[0][0] = 'a';
$map[0][1] = 'b';
$map[1][0] = 'c';
$map[1][1] = 'd';

我想只将$ map [1]下的所有内容(通过引用)传递给子程序。怎么做?

3 个答案:

答案 0 :(得分:4)

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

现在,你明白为什么我喜欢->语法,尽管它完全没必要。它有助于提醒我正在处理的事情。

答案 1 :(得分:1)

您可以发送数组引用,

sub mysub {
  my ($aref) = @_;

  # work with @$aref ..
}

mysub($map[1]);

答案 2 :(得分:1)

只需传递标量$map[1]

fn($map[1]);

sub fn
{
    my @loc_map_1 = @{ $_[0] };

请记住,perl没有“真正的”二维数组。在您的情况下,map是一个包含2个数组引用的数组。

相关问题